getTasksWithCompletionHandler的用法
最近在学习iOS的NSSession的后台下载,使用getTasksWithCompletionHandler获取下载任务时候,发现一些问题,希望分享一下;
第一次写博客有点乱,大家不要见怪~~
NSURLSession *flickrDownloadSession; [flickrDownloadSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { if (![downloadTasks count]) { NSURLSessionDownloadTask * task = [self.flickrDownloadSession downloadTaskWithURL:[FlickrFetcher URLforRecentGeoreferencedPhotos]]; task.taskDescription = FLICKR_FETCH; [task resume]; }else{ for(NSURLSessionDownloadTask *task in downloadTasks) [task resume]; } }];
- (NSURLSession *)flickrDownloadSession{ if (!_flickrDownloadSession) { static dispatch_once_t onceToken; dispatch_once(&onceToken,^{ NSURLSessionConfiguration *urlConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:FLICKR_FETCH]; urlConfig.allowsCellularAccess = NO; _flickrDownloadSession = [NSURLSession sessionWithConfiguration:urlConfig delegate:self delegateQueue:nil]; }); } return _flickrDownloadSession; }
//当任务下载完成之后会执行该委托
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ if ([downloadTask.taskDescription isEqualToString:FLICKR_FETCH]) { NSManagedObjectContext * context = self.photoDataBaseContext; if (context) { NSArray * photos = [self flickrphotosAtURL:location];//Call 1 [context performBlock:^{ [Photo loadPhotosFromFlickr:photos inManageObjectContext:context]; [context save:NULL]; }]; }else{ [self flickrDownloadTaskMightBeComplete];//Call2 } } }
这个方法执行于主队列,但是后面的那个Block语句 ^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {}
block 执行是在另外一个代理队列;一般通过判断downloadTasks数组的个数来计算现在还有多少个下载任务没有被完成,也就是还没执行didFinishDownloadingToURL委托,来设置下载任务;
当在xcode5的仿真器上仿真时,无论删除程序还是怎么样,当发起来 getTasksWithCompletionHandler,只要没有下载完,那么 [downloadTasks count]就会一直为1,但是当真机器调试的时候,只要删除任务,那么[downloadTasks count]就为0,还有如果长时间发起了任务而一直没有得到下载结果,系统会自动杀死该程序;