NSURLSession 简单分析

235 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

先来看一些优点:

后台上传和下载:只需在创建NSURLSession的时候配置一个选项,就能得到后台网络的所有好处。这样可以延长电池寿命,并且还支持UIKit的多task,在进程间使用相同的委托模型。

能够暂停和恢复网络操作:使用NSURLSession API能够暂停,停止,恢复所有的网络任务,再也完全不需要子类化NSOperation.

可配置的容器:对于NSURLSession里面的requests来说,每个NSURLSession都是可配置的容器。举个例来说,假如你需要设置HTTP header选项,你只用做一次,session里面的每个request就会有同样的配置。

提高认证处理:认证是在一个指定的连接基础上完成的。在使用NSURLConnection时,如果发出一个访问,会返回一个任意的request。此时,你就不能确切的知道哪个request收到了访问。而在NSURLSession中,就能用代理处理认证。

丰富的代理模式:在处理认证的时候,NSURLConnection有一些基于异步的block方法,但是它的代理方法就不能处理认证,不管请求是成功或是失败。在NSURLSession中,可以混合使用代理和block方法处理认证。

上传和下载通过文件系统:它鼓励将数据(文件内容)从元数据(URL和settings)中分离出来。

NSURLSession vs NSURLConnection

“哇喔,看起来NSURLSession好复杂!”,你可能会这样想。“还是坚持用NSURLConnection吧。”

别担心 — 使用NSURLSession处理简单task就如使用NSURLConnection一样容易。例如,我们使用一个简单的网络调用,来得到伦敦最新天气的JSON数据。

假设你有这样一个URL字符串:

NSString*londonWeatherUrl=@"http://api.openweathermap.org/data/2.5/weather?q=London,uk";

首先,使用NSURLConnection会这么做:

NSURLRequest*request=[NSURLRequest requestWithURL:[NSURL URLWithString:londonWeatherUrl]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse*response,NSData*data,NSError*connectionError){// handle response}];

那来看下NSURLSession是怎么做的。这个是NSURLSession使用的最简单方法。随后你还会看到怎样配置session,设置其他的特性,比如代理。

NSURLSession*session=[NSURLSession sharedSession];[[session dataTaskWithURL:[NSURL URLWithString:londonWeatherUrl]completionHandler:^(NSData*data,NSURLResponse*response,NSError*error){// handle response}]resume];

注意,你不需要指定运行哪个队列,默认会开辟一个后台线程。如果有两个的话,这种设计可能就比较难区分之间的不同。苹果官方旨在使用dataTaskWithURL来代替NSURLConnection中的sendAsynchronousRequest

看吧,NSURLSession就如NSURLConnection一样易用,并且还有一些额外的功能。