昨天翻译了一篇《NSURLSession的使用》的文章,地址:http://www.cnblogs.com/JackieHoo/p/4995733.html,原文是来自苹果官方介绍NSURLSession技术实现网络请求的原理文章,文章中提到NSURLSession网络请求技术是NSURLSession这个新类和它相关类的套件集合。今天这篇文章,我就重点介绍下NSURLSession套件的几个重要类。
首先我们看看下面这张图:
从图中可以看出NSURLSession主要由NSURLSessionConfiguration以及一个可选代理组成。为了完成网络请求我们需要创建NSURLSessionTask对象。
NSURLSessionConfiguration
NSURLSessionConfiguration有三种创建方式:
1.defaultSessionConfiguration
2.ephemeralSessionConfiguration
3.backgroundSessionConfiguration
这三个方式我们在前文中已经有所介绍了,当我们创建了NSURLSessionConfiguration之后,我们还可以设置它的一些其他属性,比如下面的代码的几个常用属性:
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; // 不允许移动网络,只允许WIFI操作网络请求。 sessionConfig.allowsCellularAccess = NO; // 只允许接受json数据 [sessionConfig setHTTPAdditionalHeaders: @{@"Accept": @"application/json"}]; // 设置请求的超时时间为30秒 sessionConfig.timeoutIntervalForRequest = 30.0; //设置资源处理的最长时间 sessionConfig.timeoutIntervalForResource = 60.0; //设置app对单一主机的最大的连接数 sessionConfig.HTTPMaximumConnectionsPerHost = 1;
当然还有其他属性,您可以查看文档深入了解。
NSURLSession
NSURLSession被设计来用来替代NSURLConnection技术的。会话通过它的任务NSURLSessionTask对象处理网络请求。使用NSURLSession你可以方便的使用带有block的方法、代理等。下面我们举一个例子:
// 百度图标的图片地址 NSString *imageUrl = @"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"; // 会话配置设置为默认配置 NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; // 使用默认配置初始化会话 NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; // 创建 下载图片任务 NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithURL:[NSURL URLWithString:imageUrl] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { // 图片下载完成执行的block,在这里我们处理图片 UIImage *downloadedImage = [UIImage imageWithData: [NSData dataWithContentsOfURL:location]]; //主线程更新界面 dispatch_async(dispatch_get_main_queue(), ^{ // _imageView.image = downloadedImage; }); }]; // 记住,任务默认是挂起状态的,创建任务后,如果需要立即执行,需要调用resume方法 [getImageTask resume];
实现NSURLSessionDownloadDelegate
我们可以实现这个代理方法,通知下载任务完成:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { //下载完成时调用 }
也可以实现这个代理来跟踪下载进度:
-(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
我们常用NSURLSessionDataTask、NSURLSessionDownloadTask、NSURLSessionUploadTask任务,其实他们有一个共同的父类NSURLSessionTask。他们的继承关系入下图所示:
图中已经明确说明了他们之间的继承关系,下面我们来介绍一下这个几个任务的不同作用:
NSURLSessionDataTask
这个任务类是用来发器http的get请求,然后下载NSData类型的数据的。然后我们将数据转换成XML,JSON,UIImage,plist等对应的类型。使用方法如下:
NSURLSessionDataTask *jsonData = [session dataTaskWithURL:yourNSURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // 我们在这例处理NSData为正确的数据类型 }];
NSURLSessionUploadTask
顾名思义,这个任务类主要是用来通过post和put上传数据到web服务器的。它的代理方法还可以允许程序了解网络传输状态的。下面示范一个上传图片的例子的使用方法:
NSData *imageData = UIImageJPEGRepresentation(image, 0.6); NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromData:imageData];
NSURLSessionDownloadTask
NSURLSessionDownloadTask类湿的下载文件变的超级简单,并且让程序随时可以控制下载的暂停和启动。这个子类和前面的恋歌任务类稍微有点不同:
1.下载的内容写到一个临时文件中
2.在下载过程中会话会调用URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:方法更新状态信息。
3.当任务下载完成URLSession:downloadTask:didFinishDownloadingToURL:方法会被调用。这个时候我们最好将文件从临时位置移到一个永久位置,或者立即打开处理。
4.当下载失败或者取消时,程序可以获取的数据然后还可以继续恢复下载。
这些特性非常有用有木有,不过千万要记住一点,所有这些任务默认创建时候是挂起的,如果要它们发挥作用,无比要执行resume方法,例如:
[uploadTask resume];
好了,NSURLSession套件实现网络请求的技术需要用到的主要类就介绍到这里,下一篇文章,我将会通过一个完整例子来实战一下NSURLSession套件的使用,并实现网络请求。