介绍NSURLSession网络请求套件

  昨天翻译了一篇《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套件的使用,并实现网络请求。

时间: 2024-10-13 11:58:53

介绍NSURLSession网络请求套件的相关文章

赠送 HttpClient 和HttpURLConnection 的轻型网络 --》线程池介绍和网络请求流程

转载注明出处 :http://blog.csdn.net/codingandroid/article/details/41748743 作为一个框架,肯定要去处理一些比较复杂的情况,正常情况下当然不会阻塞,当情况比较复杂的时候,会出现前多个网络请求的情况,那对于这种情况我们规范去管理当然是最好的了,于是我们需要一个线程池. 首先解释一下,什么叫线程池  : 每当启动一个线程的时候,我们通常代码是   new Thead(){}.start();  new 一个对象 里面又要new一个runnab

第八篇、封装NSURLSession网络请求框架

主要功能介绍: 1.GET请求操作 2.POST请求操作 1.处理params参数(例如拼接成:usename="123"&password="123") #import <Foundation/Foundation.h> @interface LYURLRequestSerialization : NSObject +(NSString *)LYQueryStringFromParameters:(NSDictionary *)paramete

iOS 网络请求NSURLSession

iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我想是时候来分享一些对于我对于这些新的 API 的看法和心得了,新的 API 将如何影响我们编写程序,以及它们对于 API 设计理念的影响. NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象,在 2003 年,随着第一版的 S

Android应用中网络请求库Volley的介绍

Volley 是一个HTTP的库,使用它能让Android应用网络传输的操作更加轻松,快捷.Volley的代码是托管在Android 源代码树下的一个工程,编译出来后是一个volley.jar文件.以下是Volley的特点 自动调度在代码中提交的网络请求(http) 多个网络请求的并发执行 对用户透明的磁盘或内存的缓存机制(本质是Http缓存机制) 能够支持网络请求的优先级 能在代码中,必要时轻松的取消网络请求(如activity销毁时),可以取消指定tag的网络请求,或按某种机制分类的网络请求

Android Studio第三十期 - 介绍几种网络请求方式写法

框架git地址:附(爱一个人就要爱他(loader)的全部~) https://github.com/geeklx/MakeJarAAR 1:http://192.168.200.96/v2/weather/weather.get.info 请求方式:POST     请求示例 {    "verify_info":{        "app":{            "app_id":"2e263d60-2d48-43d9-b699

AFNetWorking 网络请求转载

今天开始会写几篇关于AFN源码解读的一些Blog,首先要梳理一下AFN的整体结构(主要是讨论2.x版本的Session访问模块):我们先看看我们最常用的一段代码: AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:@"https://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task

自己动手写一个iOS 网络请求库的三部曲[转]

代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary 开源项目:Pitaya,适合大文件上传的 HTTP 请求库:https://github.com/johnlui/Pitaya 本系列文章中,我们将尝试使用 NSURLSession 技术构建一个自己的网络请求库. NSURLSession 简介 NSURLSession 是 iOS7 引入的新网络请求接口,在 WWDC2013

iOS之网络请求

iOS中遵循较为安全的HTTPS安全超文本协议,若想访问遵循HTTP协议的网页需要进行以下设置: 将代码<key>NSAppTransportSecurity</key>     <dict>        <key>NSAllowsArbitraryLoads</key>             <true/>    </dict> 复制到 路径下: 或者在info.plist文件中添加以下字段 请求方式分为GET和PO

Swift网络请求(Moya篇)

在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等.但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题.Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置.具体的介绍可以参考Moya的官方链接,结构图如下: 接下来就介绍一下Moya的一些常见的用法: (一)根据