• AFNetWorking 源码粗浅理解


      最近在看AFNetWorking的源码,整理出自己的一点思路。先从一个最简单的网络请求看:

        NSString *urlStr = [NSString stringWithFormat:@"http://baidu.com/1/1"];
        
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        NSDictionary *dic = @{@"qq":@"1",@"uid":@"388"};
        
        [manager POST:urlStr parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {
            
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    
        }];

      以上是AF最简单的一个POST请求。

      在生成manager的方法中 分别用到了以下几个类:

      1.AFURLRequestSerialization  2.AFURLResponseSerialization  3.AFSecurityPolicy  4.AFNetworkReachabilityManager

      1:设置请求头等参数 2:设置返回参数 3:网络安全的设置 4:监测网络连接状态   manager为默认初始化,所以以上状态是默认属性。

      以上是AF的初始化过程。在manager调用post方法时,做了以下操作:

      生成网络请求,并将网络操作添加到NSOperation的一个子类中 ---> AFHTTPRequestOperation 的一个实例中 , AFHTTPRequestOperation继承自AFURLConnectionOperation, 通过AFURLConnectionOperation类做网络请求,并通过监测AFOperationState属性状态来确定网络请求是否完成,最后通过Block回调传递参数。全过程是异步操作。

     

      总结:其中主要用到了  NSOperation异步操作以及NSURLConnection的代理方法,两者相结合,最后通过kvo监测operation的状态,调用Block完成网络请求的回调。

      以上为2.0以前调用方法。

       

       3.0以后新方法:

      AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        NSDictionary *dic = @{@"qq":@"1",@"uid":@"388"};
        
        [manager POST:urlStr parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
        }];

      以上方法用NSURLSession方法来做网络请求,同比上述方法省去了对线程的操作。其中关于AFURLSessionManagerTaskDelegate这个类还待研究。

     

     

     

  • 相关阅读:
    打造一款便携版的Sublime Text
    git stash命令使用手册
    Java List 转 String
    myeclipse中java文件头注释格式设置
    IntelliJ IDEA详细配置和使用教程-字体、编码和基本设置
    Android Studio添加文件注释头模板?
    Windows + Ubuntu下JDK与adb/android环境变量配置完整教程
    android studio gradle dependencies 包存放在哪儿?
    用Gradle命令行编译Android工程
    十分钟玩转 jQuery、实例大全
  • 原文地址:https://www.cnblogs.com/jztsdwn/p/6377233.html
Copyright © 2020-2023  润新知