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

  • 相关阅读:
    ZigBee学习二 LED点对点通信
    ZigBee学习一 任务处理函数_ProcessEvent
    关于count(分组字段)的问题
    hive命令行 显示字段名配置
    Linux 查看当前目录下的文件大小
    apache 端口号与 CDH端口号对比
    dbeaver驱动问题解决方案
    【数学】递推算法之平面分割问题总结
    【HDOJ】(1426)Sudoku Killer (dfs)
    【牛客】牛客小白月赛1(数学)
  • 原文地址:https://www.cnblogs.com/zuopeng/p/4062035.html
Copyright © 2011-2022 走看看