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

  • 相关阅读:
    经济学原理---10 外部性-- 读书笔记
    经济学原理---9应用:国际贸易--- 读书笔记
    人月神话阅读笔记之一
    小水王
    构建之法读书笔记之五
    课堂作业
    时间记录日志
    构建之法读书笔记之四
    查找水王程序
    代码阅读方法与实践阅读笔记01
  • 原文地址:https://www.cnblogs.com/zuopeng/p/4062035.html
Copyright © 2011-2022 走看看