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:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容