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

getTasksWithCompletionHandler的用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. CTF中常见文件的文件头(十六进制)

    jpg/jpeg FF D8 FF E0 或 FF D8 FF E1 或 FF D8 FF E8 png 89 50 4E 47 bmp 42 4D 36 5D gif 47 49 46 38 zip ...

  2. redis学习四 复制

    1,单机创建多实例 一个redis服务器安装多个redis实例,每个实例对应一个端口.默认端口是6379. 将redis.conf配置文件复制一份到另外一个文件夹下,然后修改其中的信息即可.   pi ...

  3. 01-19asp.net网站--关于“应用程序中的服务器错误(需添加"Jquery"ScriptRescourseMapping)”

    一般打开网页进行加载时(有缓存),会弹出以下对话框. 但是如果网页加载后出现以下错误,就是应用程序的问题了.如果出现这种问题,就需要在安装Csharp的根目录下,找到一个名为.dll结尾的Jquery ...

  4. php5.6,curl上传的变化

    $ch = curl_init ();curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false); //php5.6要加上这个 $fields = array(); ...

  5. 读书笔记<深入理解JVM>01 关于OutOfMemoryError 堆空间的溢出

    代码片段如下: package com.gosaint.shiro; import java.util.ArrayList; import java.util.List; public class H ...

  6. Select2下拉选项库 部分积累

    用了这么久的Select2插件,也该写篇文章总结总结. 在我的印象里Select2有2个版本,最新版本有一些新的特性,并且更新了一下方法参数,比最初版本要好看一些,本文针对新版本. 官网:http:/ ...

  7. ViewPager+Fragment基本使用方法(附源码)

    ViewPager+Fragment可以做出多页面滑动效果,让我们的应用程序界面操作起来更加灵活 对于ViewPager和Fragment组件还不熟悉的朋友,可以先看看相关的资料. 首先在activi ...

  8. global作用域

    1   global在函数内部 $somevar=15; function addit () { GLOBAL $somevar; $somevar++ ; echo "somevar is ...

  9. Java之IO流学习总结

    流:可以理解为数据的流动,就是一个数据流,IO流最终要以对象来体现 流的分类:     按照流的方向:输入流和输出流  (输入流只能进行读操作,输出流只能进行写操作)     按照处理数据的不同:字节 ...

  10. can通信实验

    源码讲解 1.硬件连接 需要两个开发板 2.初始化函数讲解 针对F103的 3.发送函数讲解 4.接收函数讲解 5.main函数讲解