美文网首页
AFNetworking实现简要<五>

AFNetworking实现简要<五>

作者: 爱你呢 | 来源:发表于2019-08-16 17:27 被阅读0次

    1、NSURLSession由三个基本模块构成

        1>.NSURLSession

        2>.NSURLSessionConfiguation

       3>. NSURLSessionTask

        初始化Session时未指定delegate的,通过block回调返回数据。

    2、NSURLSessionTask包括三种Task类型

        1>. NSURLSessionDataTask

        2>. NSURLSessionDownLoadTask

        3>. NSURLSessionUploadTask

    3、网络请求的过程

    创建NSURLSessionConfig对象–用创建的config对象配置初始化NSURLSession–创建NSURLSessionTask对象并resume执行,用delegate或者block回调返回数据。

    AFURLSessionManager封装了上述网络交互功能

        1>.AFURLSessionManager请求过程

        1>.初始化AFURLSessionManager

        2>.获取AFURLSessionManager的Task对象

        3>.启动Task

    AFURLSessionManager会为每一个Task创建一个AFURLSessionmanagerTaskDelegate对象,manager会让其处理各个Task的具体事务,从而实现了manager对多个Task的管理。

    初始化好manager后,获取一个网络请求的Task,生成一个Task对象,并创建了一个AFURLSessionmanagerTaskDelegate并将其关联,设置Task的上传和下载delegate,通过KVO监听download进度和upload进度。

        4>.NSURLSessionDelegate的响应

    因为AFURLSessionmanager所管理的AFURLSession的delegate指向其自身,因此所有的NSURLSessiondelegate的回调地址都是AFURLSessionmanager,而AFURLSessionmanager又会根据是否需要具体处理会将AF delegate所响应的delegate,传递到对应的AF delegate去。

    4、AFNetworking由五个模块组成

        1>. NSURLSession

     网络通信模块(核心模块) 对应——AFURLSessionManager和对HTTP协议进行特化处理的AFHTTPSessionManager,AFHTTPSessionManager是继承于AFURLSessionmanager的

        2>.Security

    网络通讯安全策略模块 对应——AFSecurityPolicy

        3>.Reachability

    网络状态监听模块 对应——AFNetworkReachabilityManager

    SCNetworkReachabilityRef 这个很重要,这个类的就是基于它开发的。

    + (instancetype)managerForDomain:(NSString *)domain; 监听制定domain的网络状态。

    + (instancetype)managerForAddress:(constvoid *)address; 监听某个socket地址的网络状态

    SCNetworkReachabilityContext  网络监控新建上下文

        4>.Seriaalization

    网络通信信息序列化、反序列化模块 对应——AFURLResponseSerialization       

        5>.UIKit

    对于IOSUIKit的扩展库——这个UIKIt库中有网络下载图片的框架等

    5、AFNetworking注意事项

        1>.Get,Post请求中downloadProgress(uploadProgress)均是在session queue(当前会话队列)中调用。因此,如果想要根据上传下载进度来改变UI,则必须在主线程中修改。(iOS中UIKit框架不是线程安全的,为了确保安全,UI均在主线程中修改)

        2>.Get,Post请求中的success,failure回调默认均是在主线程中调用,因此可以直接在该回调中修改UI。(当然,可以通过AFURLSessionManager实例中的completionQueue属性,来配置success,failure回调所在的线程)

        3>.方法或函数应该在方法最开始处使用NSParameterAssert或NSCParameterAssert来强制输入的值满足先决使用条件,其他情况下则使用NSAssert或NSCAssert(NSParameterAssert(obj) === NSParameterAssert(obj != nil))

        4>.三目运算符使用注意:x?x:y == x?:y

        5>.AFURLSessionManager中所实现的NSURLSessionDelegate,NSURLSessionTaskDelegate,NSURLSessionDataDelegate,NSURLSessionDownloadDelegate等代理方法,大部分可以通过实现AFURLSessionManager实例的某些方法,来替换代理方法的实现。例如:

    NSURLSessionDelegate中的可选代理方法

    - (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error

    可以通过AFURLSessionManager中的实例方法

    - (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block;来替换。

    6、AFNetWorking是基于NSURLSession,在生成配置的时候有三种配置选择

    + (NSURLSessionConfiguration *)defaultSessionConfiguration;  

    //默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。

    + (NSURLSessionConfiguration *)ephemeralSessionConfiguration;  

    //瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。

    + (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;  

    //后台会话模式(background):该模式在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的ID用于标识完成工作的后台会话。

    也就是说default同时实现了内存缓存和硬盘缓存,ephemeral实现了内存缓存,对于图片下载我们当然选择default。我们还可以对缓存的大小进行设置,只需要对NSURLCache进行初始化就可以了

    也可以单独对NSURLSession的configuration进行设置,在AFNetWorking中对于图片网络请求设置了20M的内存缓存和150M的硬盘缓存:

    + (NSURLCache *)defaultURLCache {

       return [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024

                                            diskCapacity:150 * 1024 * 1024

                                                diskPath:@"com.alamofire.imagedownloader"];

    }

    A、缓存策略是指对网络请求缓存如果处理,是使用缓存还是不使用

    NSURLRequestUseProtocolCachePolicy: 对特定的URL请求使用网络协议中实现的缓存逻辑。这是默认的策略。

    NSURLRequestReloadIgnoringLocalCacheData:数据需要从原始地址加载。不使用现有缓存。

    NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不仅忽略本地缓存, 同时也忽略代理服务器或其他中间介质目前已有的、协议允许的缓存。

    NSURLRequestReturnCacheDataElseLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么从原始地址加载数据。

    NSURLRequestReturnCacheDataDontLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么放弃从原始地址加载数据,请求视为失败(即:“离线”模式)。

    NSURLRequestReloadRevalidatingCacheData:从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。

    B、在AFNetWorking中同样对configuration进行设置

    configuration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;

    C、如果你继承AFImageDownloader重新实现了他的初始化,requestCachePolicy注意AFImageDownloader中只有三种才设置了缓存

    a、case NSURLRequestUseProtocolCachePolicy:

    b、case NSURLRequestReturnCacheDataElseLoad:

    c、case NSURLRequestReturnCacheDataDontLoad:

    相关文章

      网友评论

          本文标题:AFNetworking实现简要<五>

          本文链接:https://www.haomeiwen.com/subject/pjmqsctx.html