10

iOS 初探 AFNetworking

 3 years ago
source link: https://gsl201600.github.io/2020/07/15/iOS%E5%88%9D%E6%8E%A2AFNetworking/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
2020-07-15 • 于 代码库 阅读 18

iOS 初探 AFNetworking

本文不对AFNetworking作全面的解析,仅对比解析一下2.x3.x的差异。

  1. AFNetworking分为如下5个功能模块
  • 网络通信模块(AFURLSessionManager、AFHTTPSessionManger)
  • 网络状态监听模块(Reachability)
  • 网络通信安全策略模块(Security)
  • 网络通信信息序列化/反序列化模块(Serialization)
  • 对于iOS UIKit库的扩展(UIKit)
  1. AFNetworking 2.x需要常驻线程而3.x不需要常驻线程
    2.x常驻线程用来并发请求和处理数据回调,避免多个网络请求的线程开销(不用开辟一个线程,就保活一条线程);而3.x不需要常驻线程是因为NSURLSession可以指定回调delegateQueueNSURLConnection不行;
    NSURLConnection的一大痛点就是:发起请求后,需要一直处于等待回调的状态。而3.xNSURLSession解决了这个问题;NSURLSession发起的请求,不再需要在当前线程进行回调,可以指定回调的delegateQueue,这样就不用为了等待代理回调方法而保活线程了

  2. 3.x需要设置最大并发数为1(self.operationQueue.maxConcurrentOperationCount = 1),2.x为什么不需要
    功能不一样:3.xoperationQueue是用来接收NSURLSessionDelegate回调的,鉴于一些多线程数据访问的安全性考虑,设置了maxConcurrentOperationCount = 1来达到并发的请求串行的进行回调的效果。而2.xoperationQueue是用来添加operation进行并发请求的,所以不要设置为1

注意:并发数并不等于所开辟的线程数,具体开辟几条线程由系统决定

  1. 3.x为什么要串行回调
    1
    2
    3
    4
    5
    6
    7
    8
    9
    - (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
    NSParameterAssert(task);
    AFURLSessionManagerTaskDelegate *delegate = nil;
    [self.lock lock];
    //给所要访问的资源加锁,防止造成数据混乱
    delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
    [self.lock unlock];
    return delegate;
    }
    从代码可以看出,这边对self.mutableTaskDelegatesKeyedByTaskIdentifier的访问进行了加锁,目的是保证多线程环境下的数据安全。既然加了锁,就算maxConcurrentOperationCount不设为1,当某个请求正在回调时,下一个请求还是得等待一直到上个请求获取完所要的资源后解锁,所以这边并发回调也是没有意义的。相反多task回调导致的多线程并发,还会导致性能的浪费
-------------本文结束感谢您的阅读-------------
最近的文章

iOS 面试题-2019.下

简要说一下autoreleasePool的数据结构

简单说是双向链表,每张链表头尾相接,有parent、child指针,每创建一个池子,会在首部创建一个哨兵对象作为标记,最外层池子的顶端会有一个next指针。当链表容量满了,就会在链表的顶端,并指向下一张表

说一下autoreleasePoo …

2020-09-09 • 于 代码库 继续阅读
更早的文章

iOS 正则匹配常用方法

验证手机号 123456// 验证手机号+ (BOOL)isValidatePhone:(NSString *)phone{ NSString *phoneRegex = @"^1([358][0-9]|4[579]|66|7[0135678 …

2020-07-08 • 于 代码库 继续阅读

© 2020 Gsl - 本站点采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 - 本站由 @gsl 创建,基于 Hexo 搭建,使用 new-vno 主题,原创出自onevcat 本站总访问量25413次

总访客数15437人

本站已安全运行 723 天 15 小时 43 分 49 秒


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK