IOS7 NSURLSession使用说明及后台工作流程分析

http://www.cnblogs.com/biosli/p/iOS_Network_URL_Session.html

NSURLSession简介

NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的。在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。

NSURLSession提供的功能:

  • 通过URL将数据下载到内存
  • 通过URL将数据下载到文件系统
  • 将数据上传到指定URL
  • 在后台完成上述功能

 

工作流程

如果我们需要利用NSURLSession进行数据传输我们需要:

  1. 创建一个NSURLSessionConfiguration,用于第二步创建NSSession时设置工作模式和网络设置:

工作模式分为:

  • 一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。
  • 及时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。
  • 后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个(后面会讲到)。

网络设置:参考NSURLConnection中的设置项。

  1. 创建一个NSURLSession,系统提供了两个创建方法:

  • sessionWithConfiguration:
  • sessionWithConfiguration:delegate:delegateQueue:

    第一个粒度较低就是根据刚才创建的Configuration创建一个Session,系统默认创建一个新的OperationQueue处理Session的消息。

    第二个粒度比较高,可以设定回调的delegate(注意这个回调delegate会被强引用),并且可以设定delegate在哪个OperationQueue回调,如果我们将其设置为[NSOperationQueue mainQueue]就能在主线程进行回调非常的方便。

  2.创建一个NSURLRequest调用刚才的NSURLSession对象提供的Task函数,创建一个NSURLSessionTask。

  根据职能不同Task有三种子类:

  • NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果;
  • NSURLSessionDownloadTask:下载用的Task;
  • NSURLSessionDataTask:可以上传内容,上传完成后再进行下载。

  得到的Task,调用resume开始工作。

  3. 如果是细粒度的Session调用,Session与Delegate会在指定的OperationQueue中进行交互,以咱们下载例子,交互过程的顺序图如下(假如不需要鉴权,即非HTTPS请求):

 

 

  5. 当不再需要连接调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。

  6. 如果是一个BackgroundSession,在Task执行的时候,用户切到后台,Session会和ApplicationDelegate做交互。当程序切到后台后,在BackgroundSession中的Task还会继续下载,这部分文档叙述比较少,现在分三个场景分析下Session和Application的关系:

  • 当加入了多个Task,程序没有切换到后台。

  这种情况Task会按照NSURLSessionConfiguration的设置正常下载,不会和ApplicationDelegate有交互。

  • 当加入了多个Task,程序切到后台,所有Task都完成下载。

  在切到后台之后,Session的Delegate不会再收到,Task相关的消息,直到所有Task全都完成后,系统会调用ApplicationDelegate的application:handleEventsForBackgroundURLSession:completionHandler:回调,之后“汇报”下载工作,对于每一个后台下载的Task调用Session的Delegate中的URLSession:downloadTask:didFinishDownloadingToURL:(成功的话)和URLSession:task:didCompleteWithError:(成功或者失败都会调用)。

  之后调用Session的Delegate回调URLSessionDidFinishEventsForBackgroundURLSession:。

  注意:在ApplicationDelegate被唤醒后,会有个参数ComplietionHandler,这个参数是个Block,这个参数要在后面Session的Delegate中didFinish的时候调用一下,如下:


@implementation APLAppDelegate

 

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier

  completionHandler:(void (^)())completionHandler

{

    BLog();

    /*

     Store the completion handler. The completion handler is invoked by the view controller's checkForAllDownloadsHavingCompleted method (if all the download tasks have been completed).

     */

      self.backgroundSessionCompletionHandler = completionHandler;

}

//……

@end

 

//Session的Delegate

@implementation APLViewController

 

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session

{

    APLAppDelegate *appDelegate = (APLAppDelegate *)[[UIApplication sharedApplication] delegate];

    if (appDelegate.backgroundSessionCompletionHandler) {

        void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler;

        appDelegate.backgroundSessionCompletionHandler = nil;

        completionHandler();

    }

 

    NSLog(@"All tasks are finished");

}

@end

 

  • 当加入了多个Task,程序切到后台,下载完成了几个Task,然后用户又切换到前台。(程序没有退出)

  切到后台之后,Session的Delegate仍然收不到消息。在下载完成几个Task之后再切换到前台,系统会先汇报已经下载完成的Task的情况,然后继续下载没有下载完成的Task,后面的过程同第一种情况。

  • 当加入了多个Task,程序切到后台,几个Task已经完成,但还有Task还没有下载完的时候关掉强制退出程序,然后再进入程序的时候。(程序退出了)

  最后这个情况比较有意思,由于程序已经退出了,后面没有下完Session就不在了后面的Task肯定是失败了。但是已经下载成功的那些Task,新启动的程序也没有听“汇报”的机会了。经过实验发现,这个时候之前在NSURLSessionConfiguration设置的NSString类型的ID起作用了,当ID相同的时候,一旦生成Session对象并设置Delegate,马上可以收到上一次关闭程序之前没有汇报工作的Task的结束情况(成功或者失败)。但是当ID不相同,这些情况就收不到了,因此为了不让自己的消息被别的应用程序收到,或者收到别的应用程序的消息,起见ID还是和程序的Bundle名称绑定上比较好,至少保证唯一性。

总结

  就像前面说的,在普通的应用场景下NSURLSession与NSURLConnection相比没有什么优势,但是在程序切换到后台之后Background的Session就显得更加灵活了。

  另外,现在主流的网络开发框架AFNetworking已经更新到了2.0(只支持iOS 6 / iOS 7),其中最重要的一个更新就是添加了NSURLSession相关的支持。虽然就我现在(2013.10.13)看到他们的源码中,还没有完全的支持后台的Session(或者说没有考虑全我上述的后台情况),但是大家有兴趣可以关注一下他们后续的更新情况。

参考资料:

苹果官方文档:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW1

注意:苹果又开始不更新Xcode 中的文档,然后悄悄在网上更新了,大家请关注相关文档最后的更新时间,以最新的为准

AFNetworking 2.0:

https://github.com/AFNetworking/AFNetworking/

时间: 2024-10-30 20:33:55

IOS7 NSURLSession使用说明及后台工作流程分析的相关文章

jbpm后台已经搭建好了,前台web页面怎么实现工作流程啊?!!!

问题描述 jbpm后台已经搭建好了,前台web页面怎么实现工作流程啊?!!!麻烦大哥师傅们帮帮忙吧,谢谢了!!! 解决方案 jBPM 前台提供了默认的实现就是 WebConsole,如果你是用 JSF 做前台的那么祝贺你,你修改一下默认的 WebConsole 就行了.(WebConsole的源码貌似要通过 CVS 下载)如果你不是用 JSF 做前台的,那么你就要手动去实现它,比如我是用 Flex 做显示的那么,我可以通过调用 jBPM 提供的一些 API 来得到当前正在执行的 Process

一个职业seoer一天的工作流程

不论是个人还是企业,如果希望通过网络获取利润,大部分都需要和搜索引擎打交道,seo当然是一种相对而言廉价的推广方式,关于它的优缺点这里就不赘述了,今天本人作为一个职业seoer要谈谈如何让自己的seo工作流程化,让搜索引擎营销更高效,因为只有合理的计划才能加速目标的实现.现仅以本人一天的seoer工作流程分享一下网站优化的经验. 1.查看日志.打开电脑在网站后台查看搜索引擎对所优化网站的访问日志,确认HTTP状态码无意外情况,记录搜索引擎爬取路径,和之前的访问日志进行比较,并作一个小总结,保存蜘

10 款简化工作流程的运营工具

  520表白日:想要做个好运营,不会撩妹怎么行? 一年一度的520表白日来了,这一天不向男神/女神表白,恐怕又要苦逼单身一年了.没有一点特别的撩妹神技怎能顺利脱单? 俗话说,直男撩妹,姿势不对.不如趁早补课,比如,用运营产品的方式撩妹.运营产品和撩妹在思路上没啥区别:首先找到你心仪的妹子(目标用户),获取她的基本信息(用户画像),了解她的喜好和需求(客户痛点),时刻关注妹子周围的动向(市场研究),潜入她的圈子形成影响力(社群营销),获取有用的信息(数据分析),做到妹子还没开口,就已经了解妹子的

网络推广工作流程 网站的付费推广

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 今天接到市场部经理给的任务,要求我们撰写网络推广工作中各项工作的流程.目前网站的付费推广按照搜索引擎来分,主要包括百度推广以及谷歌推广两种.下面分别详细说明两种付费推广方式的工作流程: 第一:百度推广的工作流程 第1步:在推广账户当中建立推广计划.可以按照公司的产品分类建立推广计划,可以按照推广地域以及推广时间来设定推广计划,还可以为行业的竞

陈华毅:搜索引擎三段式工作流程总结

搜索引擎要处理的问题就是,在一个可以接受的时间内返回一个和该用户查询匹配的网页信息列表,这个列表包括三部分:标题,URL,描述或摘要. 现代的大规模搜索引擎一般采用三段式的工作流程,即:网页搜集.预处理.查询服务. 现在我对这三点简单的阐述下: 一.网页搜集 搜索引擎是通过爬虫去搜集互联网中的网页,放入数据库,但是这不可能是用户提交查询的时候才去抓取,而是预先就搜集好一批网页,可以把WEB上的网页集合看成是一个有向图,搜集过程从给定起始URL集合S开始,沿着这些网页中的链接,按照先深或先宽某种策

浅谈企业SEO的工作流程

不知道有多少站长在SEO公司工作过,笔者之前在一家医疗投资公司工作过得.很多SEO从业者公司的流动性非常大,但是几乎每一个优化公司都有自己的SEO工作流程,都能把每一个具体工作要求分配到每一个员工身上,今天笔者和大家分享一下自己所认为一个完整的SEO工作流程是怎样的. 站内优化记录 首先身为整个SEO团队的一员,你会发现做站内优化的员工都有一个记录习惯,没错,这就是站内优化记录表格.在网站运营的过程中,你需要记录床位关键词搜索量.核心关键词搜索量.转化率的比例等.在站内优化方面上,你添加一篇站内

详解SEO优化的工作流程三:数据分析篇

对于SEO优化而言,数据分析是非常关键的,前面说了<关于SEO优化工作流的准备篇>和<关于SEO优化工作的实施方法>之后,今天来讲讲收尾的工作,也就是数据分析.一般而言,SEO优化过程中同样需要跟进反馈的数据分析,这样才能更快速的转变自己的优化方向,比如说今天做的这个优化还没出效果,那么需要再增强一下优化力度.而这点需要从数据反馈的信息才能分析得出,所以对于SEO优化而言,数据分析就是一个确定效果的最佳拍档,也是及时改变优化方法或方向的转舵手.那么在SEO优化中,站长需要做哪些数据

交互设计师的工作流程及不同阶段的职责

  交互设计师的工作,并不仅仅是输出设计方案,我们需要参与前期的需求讨论.后期开发.测试验收等等产品设计与实现的多个环节.本篇将介绍我目前参与交互设计的工作流程以及各个阶段的工作职责. 一.需求分析阶段 这个阶段,对于不同时期的产品讨论.分析的方面侧重点不同. 1.新产品 对于从无到有的心产品,需要了解: 产品的定位是什么? 用户群体是谁?他们有哪些特征?我们的产品需要解决用户的什么痛点?如果有竞品,我们与他们的优势在哪里.差异又在哪里? 这个阶段非常重要,但是也是最难讨论清楚的,即使是产品经理

Oozie工作流程定义详解

Oozie工作流程定义是一个DAG(Directed Acyclical Graphs)图,它由控制流节点(Control Flow Nodes)或动作节点(Action Nodes)组成,各个节点又是通过表征转移的箭线(transitions arrows)互相连通.对于工作流一般对应存在流程定义语言,例如jBPM是jPDL,大多数都是基于XML定义的,Oozie流程定义语言也是基于XML定义的,称为hPDL(Hadoop Process Definition Language). 下面,我们