一起养成写作习惯!这是我参与「掘金日新计划 · 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协议中的所用事情。
在编码前,重要的先理解它们是怎样协同工作的。
NSurLSession由NSuRLSessionConfiguration和可选代理(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数据
配置网络超时,限制一个主机只有一个网络连接。
这里仅仅只做了一些简单的配置,看文档去了解更多的属性吧。