• 开发经验: 对AFN和ASI各自使用方法及区别的总结


    经过多年的iOS开发, 现总结一下HTTP协议下的两大网络处理第三方框架的使用心得


    首先来说下AFNetworking:

    一、2大管理对象
    1.AFHTTPRequestOperationManager
    * 对NSURLConnection的封装

    2.AFHTTPSessionManager
    * 对NSURLSession的封装

    二、AFHTTPRequestOperationManager的具体使用
    1.创建管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    2.封装请求参数

    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"username"] = @"哈哈";
    params[@"pwd"] = @"123";
    

    3.发送请求

    NSString *url = @"http://localhost:8080/LWServer/login";
    [mgr POST:url parameters:params
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          // 请求成功的时候调用这个block
          NSLog(@"请求成功---%@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          // 请求失败的时候调用调用这个block
          NSLog(@"请求失败");
      }];
    // GET请求
    [mgr GET:url parameters:params
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          // 请求成功的时候调用这个block
          NSLog(@"请求成功---%@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          // 请求失败的时候调用调用这个block
          NSLog(@"请求失败");
      }];
    

    三、对服务器返回数据的解析
    1.AFN可以自动对服务器返回的数据进行解析
    * 默认将服务器返回的数据当做JSON来解析

    2.设置对服务器返回数据的解析方式
    1> 当做是JSON来解析(默认做法)
    * mgr.responseSerializer = [AFJSONResponseSerializer serializer];
    * responseObject的类型是NSDictionary或者NSArray

    2> 当做是XML来解析
    * mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
    * responseObject的类型是NSXMLParser

    3> 直接返回data
    * 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
    * mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

    3.注意
    * 服务器返回的数据一定要跟responseSerializer对得上
    1> 服务器返回的是JSON数据
    * AFJSONResponseSerializer
    * AFHTTPResponseSerializer

    2> 服务器返回的是XML数据
    * AFXMLParserResponseSerializer
    * AFHTTPResponseSerializer

    3> 服务器返回的是其他数据
    * AFHTTPResponseSerializer


    其次说下是asi-http-request:

    一、发送请求的2个对象
    1.发送GET请求:ASIHttpRequest

    2.发送POST请求:ASIFormDataRequest
    * 设置参数

    // 同一个key只对应1个参数值,适用于普通“单值参数”
    - (void)setPostValue:(id <NSObject>)value forKey:(NSString *)key
    // 同一个key(同一个参数名),会对应多个参数值,适用于“多值参数”
    - (void)addPostValue:(id <NSObject>)value forKey:(NSString *)key
    

    二、发送请求
    1.同步请求
    * startSynchronous

    2.异步请求
    * startAsynchronous

    三、监听请求的过程
    1.如何监听请求过程
    1> 为代理,遵守<ASIHTTPRequestDelegate>协议,实现协议中的代理方法

    request.delegate = self;
    - (void)requestStarted:(ASIHTTPRequest *)request;
    - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;
    - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
    - (void)requestFinished:(ASIHTTPRequest *)request;
    - (void)requestFailed:(ASIHTTPRequest *)request;
    

    2> 成为代理,不遵守<ASIHTTPRequestDelegate>协议,自定义代理方法

    request.delegate = self;
    [request setDidStartSelector:@selector(start:)];
    [request setDidFinishSelector:@selector(finish:)];
    

    3> 设置block

    [request setStartedBlock:^{
        NSLog(@"setStartedBlock");
    }];
    [request setHeadersReceivedBlock:^(NSDictionary *responseHeaders) {
        NSLog(@"setHeadersReceivedBlock--%@", responseHeaders);
    }];
    [request setDataReceivedBlock:^(NSData *data) {
        NSLog(@"setDataReceivedBlock--%@", data);
    }];
    [request setCompletionBlock:^{
        NSLog(@"setCompletionBlock");
    }];
    [request setFailedBlock:^{
        NSLog(@"setFailedBlock");
    }];
    

    2.监听的使用注意
    * 如果同时设置了block和实现了代理方法,请求过程中,block和代理方法都会调用
    * 一般的调用顺序:代理方法 > block

    3.如果实现了下面的代理方法,那么responseData esponseString就没有值

    - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
    

    四、文件下载
    1.一般的下载
    1> 设置文件下载的保存路径

    request.downloadDestinationPath = filepath;
    

    2> 设置进度监听的代理(要想成为进度监听代理,最好遵守<ASIProgressDelegate>协议)

    request.downloadProgressDelegate = self.progressView;
    

    2.断点下载(断点续传)
    1> 设置文件下载的临时路径

    request.temporaryFileDownloadPath = tempFilepath;
    

    2> 设置支持断点续传

    request.allowResumeForFileDownloads = YES;
    

    五、文件上传(设置文件参数)
    1.如果知道文件路径,最好就用这个方法(因为简单)

    // ASI内部会自动识别文件的MIMEType
    [request setFile:file forKey:@"file"];
    [request addFile:file forKey:@"file"];
    [request setFile:file withFileName:@"basic.pptx" andContentType:@"application/vnd.openxmlformats-officedocument.presentationml.presentation" forKey:@"file"];
    // .....
    

    2.如果文件数据是动态产生的,就用这个方法(比如刚拍照完获得的图片数据)

    [request setData:data withFileName:@"test.png" andContentType:@"image/png" forKey:@"file"];
    

    六、ASIHttpRequest的常见用法
    1.请求超时

    @property (atomic, assign) NSTimeInterval timeOutSeconds;
    

    2.获得错误信息

    @property (atomic, retain) NSError *error;
    

    3.获得响应数据

    // 状态码
    @property (atomic, assign,readonly) int responseStatusCode;
    // 状态信息
    @property (atomic, retain,readonly) NSString *responseStatusMessage;
    // 服务器返回的具体数据(NSString格式)
    - (NSString *)responseString;
    // 服务器返回的具体数据(NSData格式)
    - (NSData *)responseData;
    

    最后是重点内容,也是面试时经常会问的问题,两者的区别:

    一、底层实现
    1> AFN的底层基于OC的NSURLConnectionNSURLSession
    2> ASI的底层基于纯C语言的CFNetwork框架
    3> ASI的运行性能 高于 AFN

    二、对服务器返回的数据处理
    1> ASI没有直接提供对服务器数据处理的方式,直接返回datastring
    2> AFN提供了多种对服务器数据处理的方式
    * JSON处理
    * XML处理
    * 其他处理

    三、监听请求的过程
    1> AFN提供了successfailure两个block来监听请求的过程(只能监听成功和失败)
    * success : 请求成功后调用
    * failure : 请求失败后调用

    2> ASI提供了3套方案,每一套方案都能监听请求的完整过程
    (监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
    * 成为代理,遵守协议,实现协议中的代理方法
    * 成为代理,不遵守协议,自定义代理方法
    * 设置block

    四、在文件下载和文件上传的使用难易度
    1> AFN
    * 不容易监听下载进度和上传进度
    * 不容易实现断点续传
    * 一般只用来下载不大的文件

    2> ASI
    * 非常容易实现下载和上传
    * 非常容易监听下载进度和上传进度
    * 非常容易实现断点续传
    * 下载或大或小的文件都行

    五、ASI提供了更多的实用功能
    1> 控制圈圈要不要在请求过程中转
    2> 可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
    3> 可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
    * 暂停恢复取消所有的请求
    * 监听整个队列中所有请求的下载进度和上传进度

  • 相关阅读:
    指针与数组关联导致的一些现象 分类: H_HISTORY 20130211 20:14 516人阅读 评论(0) 收藏
    宏定义一些内容 分类: H_HISTORY 20130207 23:20 585人阅读 评论(0) 收藏
    使用lstat()判断文件类型 分类: H_HISTORY 20130224 11:48 703人阅读 评论(0) 收藏
    关于VMware虚拟机的上网 分类: C_OHTERS 20130220 14:36 336人阅读 评论(0) 收藏
    Segmentation fault (core dumped) 分类: H_HISTORY 20130206 11:34 18800人阅读 评论(0) 收藏
    C语言内存分配时间 分类: H_HISTORY 20130211 10:51 1432人阅读 评论(3) 收藏
    GTK+与QT的对比 分类: H_HISTORY 20130205 09:27 3101人阅读 评论(0) 收藏
    枚举作为整数 分类: H_HISTORY 20130208 11:22 576人阅读 评论(0) 收藏
    01背包问题,动态规划求解
    求两个字符串的相似度或子串
  • 原文地址:https://www.cnblogs.com/lichwu/p/4349763.html
Copyright © 2020-2023  润新知