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: