NSURLSession教程

在iOS的7,苹果公司已经推出了NSURLSession,这是一组类,取代NSURLConnection的联网的首选方法。
为什么要使用NSURLSession?

1、背景上传和下载:

只需在创建NSURLSession当一个配置选项,你会得到后台网络的所有好处。这有助于电池寿命,支持多任务处​​理的UIKit,并使用相同的委托模型过程中的传输。
2、能够暂停和恢复网络的操作:

正如您稍后将看到,与NSURLSession API的任何网络任​​务,可以暂停,停止,并重新启动。没有的NSOperation子类必须的。
3、可配置的容器:

每个NSURLSession是可配置的容器将请求转换。例如,如果你需要设置一个HTTP头选项,您只需做一次,并在会话中的每个请求将具有相同的配置。
4、子类化和私有存储:

NSURLSession是子类化,你可以配置会话使用私有存储每个会话的基础上。这可以让你有全局状态之外的私人存储对象。
5、改进的认证处理:

进行身份认证在一个特定的连接基础。当使用NSURLConnection的,如果发出一个认证挑战,这一挑战会回来的任意请求,你不会确切地知道什么样的要求越来越挑战。随着NSURLSession,委托处理身份验证。
6、丰富的代表机型:

NSURLConnection的有一些异步的基于块的方法,但委托不能与他们使用。当该请求是由它或者工程或出现故障时,即使是需要验证。随着NSURLSession你可以有一种混合的方法,用异步的基于块的方法,并设置一个委托来处理身份验证。
7、通过文件系统上载和下载:

这鼓励的数据(文件的内容)从元数据分离(URL和设置)。

NSURLSession vs NSURLConnection
使用NSURLSession是正利用其predecessory NSURLConnection的简单任务轻松。举一个例子,让我们来看看制作一个简单的网络调用来获取JSON最新的天气在伦敦的一个例子
假设你有这样的NSString构造的NSURL:
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最简单的方法。在教程的后面,您将看到如何配置一样代表团会议和设置等功能。
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:londonWeatherUrl]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// handle response

}] resume];
请注意,您并不需要指定要运行什么排队。除非你指定,否则电话将在后台线程进行。它可能是很难注意到这两者之间的差,这是由设计。苹果提到,dataTaskWithURL打算替换sendAsynchronousRequest在NSURLConnection的。
所以基本上,当你需要它 - NSURLSession是和NSURLConnection的使用一样的,对于简单的任务一样简单,并具有丰富的附加功能集。
NSURLSession vs AFNetworking
提及AFNetworking框架是完全没有通话的网络代码,这是可用的iOS / OS X的最流行的框架,由辉煌Mattt汤普森创造之一。
注:要了解更多有关AFNetworking,发现GitHub的页面:https://github.com/AFNetworking/AFNetworking
下面是相同的数据任务的代码是什么样子用AFNetworking 1.x中:
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:londonWeatherUrl]];

AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request,
NSHTTPURLResponse *response,
id JSON) {
// handle response
} failure:nil];
[operation start];
对使用AFNetworking的好处是数据类型类用于处理的响应数据。使用AFJSONRequestOperation(或类似类XML和的plist)的成功块已经解析了响应,并返回该数据给你。随着NSURLSession您收到的NSData回在完成处理程序,所以你需要转换NSData的成JSON或其它格式。
所以,你可能想知道,如果你要使用AFNetworking或只是坚持NSURLSession。
就个人而言,我认为,对于简单的需求,最好坚持使用NSURLSession - 这避免引入不必要的第三方的依赖到项目中。此外,在新代表,配置和基于任务的API了很多的AFNetworking添加了“缺失的功能”,现在包括在内。
但是,如果你想使用一些发现AFNetworking像序列化和进一步的UIKit集成(除UIImageView的类别)的新的2.0特性那么这将是很难反驳用它!

注:在2.0分支AFNetworking,他们已经转换到使用NSURLSession。看到这个帖子的详细资料:
https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide
一个NSURLSession是使用NSURLSessionConfiguration带有可选委托进行。在创建会话时再满足你的网络创建NSURLSessionTask的需求。
NSURLSessionConfiguration
有三种方法来创建一个NSURLSessionConfiguration::
defaultSessionConfiguration – -创建一个使用全局高速cache, cookie and credential 存储对象的配置对象。这是导致你的会话是最像NSURLConnection的配置。
ephemeralSessionConfiguration – 这个配置是“私人”的会议,也没有永久存储缓存,cookie或凭证存储对象
backgroundSessionConfiguration – 这是当你想从远程推送通知网络电话或当应用程序被暂停使用的配置。
一旦创建了NSURLSessionConfiguration,您可以设置各种属性就可以是这样的:
NSURLSessionConfiguration *sessionConfig =
[NSURLSessionConfiguration defaultSessionConfiguration];

// 1
sessionConfig.allowsCellularAccess = NO;

// 2
[sessionConfig setHTTPAdditionalHeaders:
@{@”Accept”: @”application/json”}];

// 3
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;
sessionConfig.HTTPMaximumConnectionsPerHost = 1;
1、在这里,您限制网络业务只有WiFi功能。
2、这将设置所有请求只接受JSON响应。
3、这些属性将配置超时资源或请求。你也可以限制你的应用程序只需要一个网络连接到主机。

这些只是少数人的事情,你可以配置,一定要检查出文档的完整列表。

NSURLSession
NSURLSession是专为NSURLConnection的替代API。会议通过他们的爪牙,也被称为NSURLSessionTask对象做他们的工作。随着NSURLSession您可以创建使用基于块的方便的方法,设置一个委托,或双方的任务。例如,如果你想下载的图像(challenge hint),你需要创建一个NSURLSessionDownloadTask。

首先,你需要创建会话。下面是一个例子:
// 1
NSString *imageUrl =
@”http://www.raywenderlich.com/images/store/iOS7_PDFonly_280@2x_authorTBA.png“;

// 2
NSURLSessionConfiguration *sessionConfig =
[NSURLSessionConfiguration defaultSessionConfiguration];

// 3
NSURLSession *session =
[NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
好吧,这只是从你迄今所看到的有些不同。让我们在它一步一步来。
对于这个片段,我们正在下载相同的两个任务。.
你总是首先创建一个NSURLConfiguration.
这将创建使用当前类为代理的会话.
在创建会话,然后你可以下载图片通过创建一个完成处理程序,像这样一个任务:
// 1
NSURLSessionDownloadTask *getImageTask =
[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]

completionHandler:^(NSURL *location,
                    NSURLResponse *response,
                    NSError *error) {
    // 2
    UIImage *downloadedImage =
      [UIImage imageWithData:
          [NSData dataWithContentsOfURL:location]];
  //3
  dispatch_async(dispatch_get_main_queue(), ^{
    // do stuff with image
    _imageWithBlock.image = downloadedImage;
  });

}];

// 4
[getImageTask resume];
现在,这看起来像一些网络代码!
任务始终由会话创建的。这一个与基于块的方法来创建。记住,你仍然可以使用NSURLSessionDownloadDelegate跟踪下载进度。所以你得到两全其美! (为提示挑战
-URLSession:downloadTask
:didWriteData:totalBytesWritten
:totalBytesExpectedToWrite:
在这里,您使用在完成处理程序提供的位置变化来获得一个指向图像。
最后,你可以,例如,更新的UIImageView的形象,以显示新的文件。 (提示提示☺)
你总是要启动的任务!
还记得我前面说过,一个会话也可以创建任务,将消息发送到委托方式通知完成,等你
以下是如何将看起来,使用同一个会话从上面:
// 1
NSURLSessionDownloadTask *getImageTask =
[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]];

[getImageTask resume];
嗯,这是肯定更少的代码☺但是,如果你只做到这一点你永远不会看到任何东西。
你需要让你的委托实施从NSURLSessionDownloadDelegate协议的一些方法
首先,我们需要得到通知时,下载完成:
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
// use code above from completion handler
}
同样为您提供了该文件下载到的位置,您可以使用此与图像的工作。
最后,如果你需要跟踪下载进度,对于任一任务的创建方法,你就需要使用以下:
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@”%f / %f”, (double)totalBytesWritten,
(double)totalBytesExpectedToWrite);
}
你所看到的,NSURLSessionTask才是真正的主力“得到的东西做”在网络上。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值