二剃允、Serialization的AFURLResponseSerialization部分
AFHTTPResponseSerializer是反序列化器拢蛋,主要功能是對(duì)返回的參數(shù)進(jìn)行反序列化。
在第一篇分析AFURLSessionManager中分析過(guò)冰木,如果網(wǎng)絡(luò)請(qǐng)求返回成功將這樣對(duì)返回的參數(shù)進(jìn)行反序列化處理懦冰。
本篇就又這個(gè)入口開(kāi)始分析反序列化器是如何對(duì)返回的參數(shù)進(jìn)行處理的饮六。
在此之前先分析一下反序列化器manager.responseSerializer的初始化方法:
可看出在初始化方法中設(shè)置了self.acceptableStatusCodes和self.acceptableContentTypes這兩個(gè)屬性。self.acceptableStatusCodes為可接受的HTTP status code的集合玷过,self.acceptableContentTypes為可接受的Content-Type集合(即請(qǐng)求頭中設(shè)置的Content-Type)爽丹。
下面具體分析整個(gè)對(duì)返回參數(shù)的反序列化過(guò)程:
首先注意這個(gè)方法聲明:
error參數(shù)用的是兩個(gè)*的指針,目的是方法結(jié)束要返回這個(gè)error(由于OC方法只能有一個(gè)返回參數(shù)辛蚊,所以要使用*error指針的指針來(lái)作為參數(shù)习劫,參看詳情)。
將這個(gè)方法折疊可得:
如果response為空嚼隘,反而返回的responseIsValid反而是YES诽里。但是從調(diào)用[self validateResponse:(NSHTTPURLResponse*)responsedata:dataerror:error]來(lái)看,這個(gè)返回參數(shù)似乎不重要也很少用到飞蛹。
展開(kāi)來(lái)看:
首先看一下這個(gè)外層的判斷條件谤狡,self.acceptableContentTypes不為空,self.acceptableContentTypes不包含[response MIMEType]卧檐,[response MIMEType]為空和[data length] ==0不同時(shí)存在且[response MIMEType]不為空墓懂,當(dāng)這三個(gè)條件都滿足時(shí),進(jìn)入判斷霉囚,接著分析:
由以下可知:
繼續(xù)看滿足條件下的代碼:
配置一個(gè)字典mutableUserInfo捕仔,里邊包含[response MIMEType]、[response URL]和response信息盈罐。
繼續(xù):
如果data不為空榜跌,也將data信息添加到mutableUserInfo中。
根據(jù)mutableUserInfo構(gòu)造validationError盅粪,設(shè)置code為AFURLResponseSerializationErrorDomain钓葫。
具體構(gòu)造函數(shù)為:
繼續(xù)看接下來(lái)的判斷分支:
如果self.acceptableStatusCodes不為空,self.acceptableStatusCodes包含response.statusCode票顾,[response URL]不為空础浮,這三個(gè)條件都滿足時(shí),進(jìn)入分支奠骄,和上一個(gè)分支主體類似豆同,也是構(gòu)造具體的validationError。
整體來(lái)看含鳞,如果進(jìn)入這兩個(gè)小分支都會(huì)設(shè)置responseIsValid =NO影锈,否則responseIsValid還是YES。
最后:
如果responseIsValid為NO時(shí),將*validationError賦予傳進(jìn)來(lái)的error精居。
返回到入口這里
可知這個(gè)方法主要是判斷滿足responseIsValid的條件锄禽,如果不滿足設(shè)置其error,在這里提現(xiàn)了responseIsValid的作用靴姿,并沒(méi)有對(duì)data進(jìn)行具體處理沃但。
又這個(gè)方法的調(diào)用
可知responseObject是NSData*類型,再回到請(qǐng)求完成的調(diào)用
是將NSData*類型的返回參數(shù)直接返回佛吓,在AFNetworking的范圍內(nèi)并沒(méi)有處理宵晚。所以這種情況下是框架使用者來(lái)對(duì)responseObject做進(jìn)一步處理,一般情況下將其轉(zhuǎn)化為NSString*類型维雇,再進(jìn)行json解析淤刃,都可用系統(tǒng)方法實(shí)現(xiàn)。
最后看一下AFURLResponseSerialization的整體面貌:
和AFURLRequestSerialization類似吱型,入口方法其實(shí)也是一個(gè)協(xié)議方法:
AFHTTPResponseSerialize遵守這個(gè)協(xié)議逸贾,實(shí)現(xiàn)了這個(gè)方法,另外有
這些子類津滞,主要是分別實(shí)現(xiàn)了
這個(gè)屬性铝侵,表示可以接收具體的Content-Type。以及別的一些特性触徐。
特別提一點(diǎn)
AFHTTPSessionManager默認(rèn)的初始化方法中實(shí)現(xiàn)的是AFJSONResponseSerializer咪鲜。