• 网络请求相关小结2


    1 NSURLConnettion

                NSURLConnettion是 Core Foundation/CFNetwork框架 API 之上的一个抽象. NSURLConnettion是用来指代 Foundation 框架中的一系列组件: NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage 以及同名类 NSURLConnection.

                注1:原来的使用原理:一个 NSURLRequest 发送给 NSURLConnect.被委托对象(遵守 NSURLConnectionDeledate 和 NSURLConnectionDataDeledate 非正式协议)异步返回一个 NSURLResponce 和服务器的 NSData.

                注2:在一个请求发送给服务器的时候,系统会先查询缓存信息,然后根据策略和可用写的不同,当在缓存中找到响应则直接返回.否则,系统将根据我们的策略,将接到请求后的响应缓存到并返回.

    注3:在把请求发送给服务器的时候,服务器会发出鉴权查询,这可以有共享的 cookie 或者机密存储来自动响应,或者由被委托的对象来响应.发送中的请求,也可以被 NSURLProtocol 拦截,以便在必要的时候,无缝的改变其请求.

    NSURLConnettion是使用步骤:

    1 获取一个 URL

    2 通过 URL 创建一个请求

    3 用NSURLConnettion发送请求

    2 NSURLSession

                和 NSURLConnection 一样, NSURLSession 不仅仅包括同名的 NSURLSession, 还包括NSURLRequest 和 NSURLCache. 同时将NSURLConnection 对应为NSURLSession,NSURLSessionFiguration 以及NSURLSession 的三个子类,即NSURLSessionTask,NSURLSessionUpLoadTask 和 NSULSessionDownLoadTask.

                和 NSURLConnection 相比, NSURLSession 最大的改变可以配置每一个缓存的session 缓存, cookie 值,协议以及证书策略甚至夸程序共享这些信息.这保证了程序和网络框架之间的相互独立.每一个 NSURLSession 有一个 NSURLSessionConfiguration 来进行初始化, NSURLSessionConfiguration指定了策略,以及在移动设备上增强性能的选项.

                NSURLSession 的另一个特点就是 session Task, 用来处理的上传和下载.和 NSURLConnection 最大的不同之处在于,所有的 task 共享其创造者 NSURLSession.

                注: NSURLSessionTask分析

                NSURLSessionTask 是一个抽象类,里面包含NSURLSessionDataTask  , NSURLSessionDownLoadTask 以及 NSURLSessionUpLoadTask三个子类.这三个子类封装了网络的基本任务:获取数据,上传和下载

     

                使用原理:当一个 NSURLSessionDataTask 完成的时候,会有一个返回的数据,一个 NSURLSessionDownLoadTask 完成的时候会带一个临时文件的路径.文件上传的时候也会返回一定的数据,所以可以说 NSURLSessionUpLoadTask 是继承于 NSURLSessionDataTask.所有的 Task 都可以取消,暂停和恢复,当暂停的时候回记录当前的位置,以便下载继续从此点继续下载.需要说明的是 NSURLSessionTask 是有 NSURLSession 创建的.

                NSURLSession的使用步骤:和 NSURLConnection 基本相似,然后使用resume方法来讲它运行.

                1 获取一个 URL

                2 通过 URL 创建一个请求

                2.1 创建一个上传的NSData(UpLoad 上传的时候用)

                3 创建一个NSURLSession的单例

                4 通过NSURLSession发送请求(注:使用 resume)

    实例:

    1 DataTask

    NSURL *URL = [NSURL URLWithString:@"http://example.com"];

     NSURLRequest *request = [NSURLRequest requestWithURL:URL];

     

     NSURLSession *session = [NSURLSession sharedSession];

     NSURLSessionDataTask *task = [session dataTaskWithRequest:request

                                             completionHandler:

         ^(NSData *data, NSURLResponse *response, NSError *error) {

             // ...

         }];

     

     [task resume];

    2 UpLoadTask

    NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];

     NSURLRequest *request = [NSURLRequest requestWithURL:URL];

     NSData *data = ...;

     

     NSURLSession *session = [NSURLSession sharedSession];

     NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request

                                                           fromData:data

                                                       completionHandler:

         ^(NSData *data, NSURLResponse *response, NSError *error) {

             // ...

         }];

     

     [uploadTask resume];

    3 DownLoadTask

    注: Download task 也需要一个 request,不同之处在于 completionHandler 这个 block。Data task 和 upload task 会在任务完成时一次性返回,但是 Download task 是将数据一点点地写入本地的临时文件。所以在 completionHandler 这个 block 里,我们需要把文件从一个临时地址移动到一个永久的地址保存起来.

    NSURL *URL = [NSURL URLWithString:@"http://example.com/file.zip"];

     NSURLRequest *request = [NSURLRequest requestWithURL:URL];

     

     NSURLSession *session = [NSURLSession sharedSession];

     NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request

                                                completionHandler:

        ^(NSURL *location, NSURLResponse *response, NSError *error) {

            NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

            NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];

            NSURL *newFileLocation = [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];

            [[NSFileManager defaultManager] copyItemAtURL:location toURL:newFileLocation error:nil];

        }];

     

     [downloadTask resume];

    3 NSURLSession 和 NSURLConnection 的区别

                NSURLSession即有 session 的代理方法又有 Task 的代理方法.session 的代理方法用来处理连接层的问题(服务器的信任,客户端证书的评估等),Task 的代理方法用来处理鉴权查询和以网络请求有关的问题.

    4 AFN 框架

                AFN 是对 NSURLConnection 的一层封装

                AFN 的主要功能:

    • NSURLConnection

    AFURLConnectionOperation

    AFHTTPRequestOperation

    AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)

    AFHTTPRequestOperationManager的属性

    1 baseURL :开发者针要对 AFHTTPRequestOperationManager 自定义一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可.

    2 requestSerializer :请求数据格式/默认是二进制的 HTTP

    3 responseSerializer :响应的数据格式/默认是 JSON 格式

    4 operationQueue

    5 reachabilityManager :网络连接管理器

     AFHTTPRequestOperationManager方法:

    1 manager :方便创建管理器的类方法

    2 HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置

    3 GET

    4 POST

    • NSURLSession

    AFURLSessionManager

    AFHTTPSessionManager(封装了常用的 HTTP 方法)

    1 GET

    2 POST

    3 UIKit+AFNetWorking分类

    4 NSProgress(利用 KVO)

    • 半自动的序列化和反序列化

    AFURLRequestSerialization :请求的数据格式/默认是二进制的

    AFURLResponseSerialization :响应的数据格式/默认是JSON格式

    • 附加功能

    1 安全策略:(HTTPS 和AFSecurityPolicy)

    2 网络检测: (对链接方式进行了封装和 AFNetWorkingReachabiliManager)

    使用链接: http://www.cnblogs.com/worldtraveler/p/4736643.html

    AFN 的使用步骤:

                1 创建一个请求操作管理者

                2 声明响应结果进行 JSON,XML等数据解析,返回 Data

                3 设置请求参数

                4 发送请求

                补充 ASI: (功能很强大,但是已经不更新了)

    ASI 使用步骤:

    1 获取 URL

    2 获取 ASI 请求对象

    3 发送请求

  • 相关阅读:
    如何快速、低成本构建一套稳定、高效、可靠的互联网主播直播/商业直播(推流/分发/播放)方案
    EasyNVR H5无插件RTSP直播方案在Windows server 2012上修复无法定位GetNumaNodeProcessorMaskEx的问题
    EasyNVR H5无插件RTSP直播方案在Windows server 2012上修复无法定位GetNumaNodeProcessorMaskEx的问题
    EasyPusher RTSP推流/EasyRTMP RTMP推流Android安卓摄像头视频偏暗的问题解决方案
    EasyPusher RTSP推流/EasyRTMP RTMP推流Android安卓摄像头视频偏暗的问题解决方案
    EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug
    Ubuntu14.04下安装eclipse
    UBuntu14.04下安装和卸载Qt5.3.1
    ubuntu创建、删除文件及文件夹,强制清空回收站方法
    Ubuntu下安装JDK1.7
  • 原文地址:https://www.cnblogs.com/xuan-yuan/p/5532201.html
Copyright © 2020-2023  润新知