一起养成写作习惯!这是我参与「掘金日新计划 · 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一样易用,并且还有一些额外的功能。