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,还有如果长时间发起了任务而一直没有得到下载结果,系统会自动杀死该程序;

原文地址:https://www.cnblogs.com/zuopeng/p/4062035.html