AFNetworking实现简要<五>

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实现简要<五>)