1配喳、NSURLSession由三個(gè)基本模塊構(gòu)成
? ? 1>.NSURLSession
? ? 2>.NSURLSessionConfiguation
? ?3>. NSURLSessionTask
????初始化Session時(shí)未指定delegate的纳胧,通過(guò)block回調(diào)返回?cái)?shù)據(jù)。
2脐恩、NSURLSessionTask包括三種Task類型
????1>. NSURLSessionDataTask
????2>. NSURLSessionDownLoadTask
????3>. NSURLSessionUploadTask
3舍肠、網(wǎng)絡(luò)請(qǐng)求的過(guò)程
創(chuàng)建NSURLSessionConfig對(duì)象–用創(chuàng)建的config對(duì)象配置初始化NSURLSession–創(chuàng)建NSURLSessionTask對(duì)象并resume執(zhí)行向族,用delegate或者block回調(diào)返回?cái)?shù)據(jù)呵燕。
AFURLSessionManager封裝了上述網(wǎng)絡(luò)交互功能
????1>.AFURLSessionManager請(qǐng)求過(guò)程
????1>.初始化AFURLSessionManager
????2>.獲取AFURLSessionManager的Task對(duì)象
????3>.啟動(dòng)Task
AFURLSessionManager會(huì)為每一個(gè)Task創(chuàng)建一個(gè)AFURLSessionmanagerTaskDelegate對(duì)象,manager會(huì)讓其處理各個(gè)Task的具體事務(wù)件相,從而實(shí)現(xiàn)了manager對(duì)多個(gè)Task的管理再扭。
初始化好manager后,獲取一個(gè)網(wǎng)絡(luò)請(qǐng)求的Task夜矗,生成一個(gè)Task對(duì)象泛范,并創(chuàng)建了一個(gè)AFURLSessionmanagerTaskDelegate并將其關(guān)聯(lián),設(shè)置Task的上傳和下載delegate紊撕,通過(guò)KVO監(jiān)聽download進(jìn)度和upload進(jìn)度罢荡。
????4>.NSURLSessionDelegate的響應(yīng)
因?yàn)锳FURLSessionmanager所管理的AFURLSession的delegate指向其自身,因此所有的NSURLSessiondelegate的回調(diào)地址都是AFURLSessionmanager,而AFURLSessionmanager又會(huì)根據(jù)是否需要具體處理會(huì)將AF delegate所響應(yīng)的delegate区赵,傳遞到對(duì)應(yīng)的AF delegate去惭缰。
4、AFNetworking由五個(gè)模塊組成
????1>. NSURLSession
?網(wǎng)絡(luò)通信模塊(核心模塊) 對(duì)應(yīng)——AFURLSessionManager和對(duì)HTTP協(xié)議進(jìn)行特化處理的AFHTTPSessionManager,AFHTTPSessionManager是繼承于AFURLSessionmanager的
????2>.Security
網(wǎng)絡(luò)通訊安全策略模塊 對(duì)應(yīng)——AFSecurityPolicy
? ? 3>.Reachability
網(wǎng)絡(luò)狀態(tài)監(jiān)聽模塊 對(duì)應(yīng)——AFNetworkReachabilityManager
SCNetworkReachabilityRef 這個(gè)很重要笼才,這個(gè)類的就是基于它開發(fā)的漱受。+ (instancetype)managerForDomain:(NSString?*)domain; 監(jiān)聽制定domain的網(wǎng)絡(luò)狀態(tài)。
+ (instancetype)managerForAddress:(constvoid?*)address; 監(jiān)聽某個(gè)socket地址的網(wǎng)絡(luò)狀態(tài)
SCNetworkReachabilityContext ?網(wǎng)絡(luò)監(jiān)控新建上下文
? ? 4>.Seriaalization
網(wǎng)絡(luò)通信信息序列化骡送、反序列化模塊 對(duì)應(yīng)——AFURLResponseSerialization ? ? ??
? ? 5>.UIKit
對(duì)于IOSUIKit的擴(kuò)展庫(kù)——這個(gè)UIKIt庫(kù)中有網(wǎng)絡(luò)下載圖片的框架等
5昂羡、AFNetworking注意事項(xiàng)
????1>.Get,Post請(qǐng)求中downloadProgress(uploadProgress)均是在session queue(當(dāng)前會(huì)話隊(duì)列)中調(diào)用各谚。因此紧憾,如果想要根據(jù)上傳下載進(jìn)度來(lái)改變UI到千,則必須在主線程中修改昌渤。(iOS中UIKit框架不是線程安全的,為了確保安全憔四,UI均在主線程中修改)
????2>.Get膀息,Post請(qǐng)求中的success,failure回調(diào)默認(rèn)均是在主線程中調(diào)用了赵,因此可以直接在該回調(diào)中修改UI潜支。(當(dāng)然,可以通過(guò)AFURLSessionManager實(shí)例中的completionQueue屬性柿汛,來(lái)配置success冗酿,failure回調(diào)所在的線程)
????3>.方法或函數(shù)應(yīng)該在方法最開始處使用NSParameterAssert或NSCParameterAssert來(lái)強(qiáng)制輸入的值滿足先決使用條件,其他情況下則使用NSAssert或NSCAssert(NSParameterAssert(obj) ===?NSParameterAssert(obj != nil))
????4>.三目運(yùn)算符使用注意:x?x:y == x?:y
????5>.AFURLSessionManager中所實(shí)現(xiàn)的NSURLSessionDelegate络断,NSURLSessionTaskDelegate裁替,NSURLSessionDataDelegate,NSURLSessionDownloadDelegate等代理方法貌笨,大部分可以通過(guò)實(shí)現(xiàn)AFURLSessionManager實(shí)例的某些方法弱判,來(lái)替換代理方法的實(shí)現(xiàn)。例如:
NSURLSessionDelegate中的可選代理方法
- (void)URLSession:(NSURLSession *)session?didBecomeInvalidWithError:(NSError *)error
可以通過(guò)AFURLSessionManager中的實(shí)例方法
- (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block;來(lái)替換锥惋。
6昌腰、AFNetWorking是基于NSURLSession,在生成配置的時(shí)候有三種配置選擇
+ (NSURLSessionConfiguration *)defaultSessionConfiguration; ?
//默認(rèn)會(huì)話模式(default):工作模式類似于原來(lái)的NSURLConnection膀跌,使用的是基于磁盤緩存的持久化策略遭商,使用用戶keychain中保存的證書進(jìn)行認(rèn)證授權(quán)。
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration; ?
//瞬時(shí)會(huì)話模式(ephemeral):該模式不使用磁盤保存任何數(shù)據(jù)捅伤。所有和會(huì)話相關(guān)的caches劫流,證書,cookies等都被保存在RAM中,因此當(dāng)程序使會(huì)話無(wú)效困介,這些緩存的數(shù)據(jù)就會(huì)被自動(dòng)清空大审。
+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier; ?
//后臺(tái)會(huì)話模式(background):該模式在后臺(tái)完成上傳和下載,在創(chuàng)建Configuration對(duì)象的時(shí)候需要提供一個(gè)NSString類型的ID用于標(biāo)識(shí)完成工作的后臺(tái)會(huì)話座哩。
也就是說(shuō)default同時(shí)實(shí)現(xiàn)了內(nèi)存緩存和硬盤緩存徒扶,ephemeral實(shí)現(xiàn)了內(nèi)存緩存,對(duì)于圖片下載我們當(dāng)然選擇default根穷。我們還可以對(duì)緩存的大小進(jìn)行設(shè)置姜骡,只需要對(duì)NSURLCache進(jìn)行初始化就可以了
也可以單獨(dú)對(duì)NSURLSession的configuration進(jìn)行設(shè)置,在AFNetWorking中對(duì)于圖片網(wǎng)絡(luò)請(qǐng)求設(shè)置了20M的內(nèi)存緩存和150M的硬盤緩存:
+ (NSURLCache *)defaultURLCache {
? ?return [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? diskCapacity:150 * 1024 * 1024
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? diskPath:@"com.alamofire.imagedownloader"];
}
A屿良、緩存策略是指對(duì)網(wǎng)絡(luò)請(qǐng)求緩存如果處理圈澈,是使用緩存還是不使用
NSURLRequestUseProtocolCachePolicy: 對(duì)特定的URL請(qǐng)求使用網(wǎng)絡(luò)協(xié)議中實(shí)現(xiàn)的緩存邏輯。這是默認(rèn)的策略尘惧。
NSURLRequestReloadIgnoringLocalCacheData:數(shù)據(jù)需要從原始地址加載康栈。不使用現(xiàn)有緩存。
NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不僅忽略本地緩存喷橙, 同時(shí)也忽略代理服務(wù)器或其他中間介質(zhì)目前已有的啥么、協(xié)議允許的緩存。
NSURLRequestReturnCacheDataElseLoad:無(wú)論緩存是否過(guò)期贰逾,先使用本地緩存數(shù)據(jù)悬荣。如果緩存中沒(méi)有請(qǐng)求所對(duì)應(yīng)的數(shù)據(jù),那么從原始地址加載數(shù)據(jù)疙剑。
NSURLRequestReturnCacheDataDontLoad:無(wú)論緩存是否過(guò)期氯迂,先使用本地緩存數(shù)據(jù)。如果緩存中沒(méi)有請(qǐng)求所對(duì)應(yīng)的數(shù)據(jù)言缤,那么放棄從原始地址加載數(shù)據(jù)嚼蚀,請(qǐng)求視為失敗(即:“離線”模式)轧简。
NSURLRequestReloadRevalidatingCacheData:從原始地址確認(rèn)緩存數(shù)據(jù)的合法性后驰坊,緩存數(shù)據(jù)就可以使用,否則從原始地址加載哮独。
B拳芙、在AFNetWorking中同樣對(duì)configuration進(jìn)行設(shè)置
configuration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
C、如果你繼承AFImageDownloader重新實(shí)現(xiàn)了他的初始化皮璧,requestCachePolicy注意AFImageDownloader中只有三種才設(shè)置了緩存
a舟扎、case NSURLRequestUseProtocolCachePolicy:
b、case NSURLRequestReturnCacheDataElseLoad:
c悴务、case NSURLRequestReturnCacheDataDontLoad: