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

你可能感兴趣的:(handler)