NSURLSession 简单分析2

281 阅读2分钟

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

NSURLSession vs AFNetworking

说到网络请求不得不说的就是AFNetworking Framework。这是iOS/OS X上最流行的框架之一,由Mattt Thompson创建。

注意:学习AFNetworking,可以在github页面上找到,AFNetworking,你还可以看这篇教程afnetworking-crash-course

下面是对于同样的数据请求,AFNetworking 1.x的代码:

NSURLRequest*request=[NSURLRequest requestWithURL:[NSURL URLWithString:londonWeatherUrl]];
AFJSONRequestOperation*operation=[AFJSONRequestOperation JSONRequestOperationWithRequest:requestsuccess:^(NSURLRequest*request,NSHTTPURLResponse*response,id JSON){// handle response}failure:nil];[operation start];

使用AFNetworking的好处之一是,它的处理响应数据是数据类型类,AFJSONRequestOperation(或类似XML,plist)的返回成功的block里面已经解析出了你要的数据。而NSURLSession接收到的是NSData类型,你需要把它再转换成JSON类型。

注意: 用NSJSONSerialization可以轻松的将NSData类型转换为JSON类型。

那么,你是喜欢用AFNetworking还是NSURLSession呢?

个人认为,简单的需求最好用NSURlSession-这可减少工程里面第三方库的依赖。当然了,现在AFNetworking也添加了新的代理,配置,基于task的API等等特性。

如果你使用了AFNetworking2.0的新特性,比如系列化,并且还集成了UIKit(加入了一些UIImageView的类目方法),现在就很难说服你不用它了。

注意: 在AFNetworking2.0的分支,他们已经转成使用NSURLSession。

AFNetworking-2.0-Migration-Guide

译者注: 中间这里有一部分讲到了Dropbox,这里就不翻译了。对于Dropbox,国内墙得厉害,完全打不开。

NSURLSession 类套(suite of classes)

苹果公司描述了新类NSURLSession,及其类套。包括新的上传,下载,处理认证等工具,能处理http协议中的所用事情。

在编码前,重要的先理解它们是怎样协同工作的。

image.png

NSurLSessionNSuRLSessionConfiguration和可选代理(optional delegate)构成。再根据你的网络需求通过NSURLSessionTask来创建session。

NSURLSessionConfiguration

有三个方法用来创建NSURLSessionConfiguration:

defaultSessionConfiguration- 使用全局的cache,cookie和credential storage objects来创建configuration对象。

ephemeralSessionConfiguration – 这个configuration用于“private” sessions,还有对于cache, cookie, or credential storage objects的非永久存储。

backgroundSessionConfiguration – 做远程push通知或是应用程序挂起的时候就要用到这个configuration。

一旦创建了NSURLSessionConfiguration就可以给它设置各种属性:

NSURLSessionConfiguration*sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration];
// 1sessionConfig.allowsCellularAccess=NO;
// 2[sessionConfig setHTTPAdditionalHeaders:@{@"Accept":@"application/json"}];
//3sessionConfig.timeoutIntervalForRequest=30.0;
sessionConfig.timeoutIntervalForResource=60.0;
sessionConfig.HTTPMaximumConnectionsPerHost=1;

限制了网络只能是wifi。

设置了所有的请求只接收JSON数据

配置网络超时,限制一个主机只有一个网络连接。

这里仅仅只做了一些简单的配置,看文档去了解更多的属性吧。