用了這么久的AFNetworking,現(xiàn)在終于有時(shí)間把它的源碼實(shí)現(xiàn)讀了一遍狐肢。不跟你多嗶嗶端辱,直入正題:這里以Http的“POST”請(qǐng)求網(wǎng)絡(luò)的方式來(lái)簡(jiǎn)單分析一下醋火。
首先介紹一下AFNetworking的文件大致結(jié)構(gòu),如下圖跟網(wǎng)絡(luò)請(qǐng)求相關(guān)的文件就是四部分(NSURLSession潜圃、Reachbaility缸棵、Security、Serialization)
一個(gè)網(wǎng)絡(luò)請(qǐng)求以調(diào)用AFHTTPSessionManager中的如下方法作為入口:
可以看到內(nèi)部實(shí)現(xiàn)是調(diào)用了另一個(gè)方法來(lái)返回dataTask谭期,然后調(diào)用[dataTask resume];方法來(lái)開(kāi)始一個(gè)網(wǎng)絡(luò)請(qǐng)求(因?yàn)橐粋€(gè)dataTask默認(rèn)是掛起狀態(tài)堵第,需要手動(dòng)調(diào)用resume方法來(lái)啟動(dòng))。這里還可以看到dataTask是作為返回值返回給調(diào)用者隧出,這將非常有用踏志,因?yàn)槲覀兛梢阅玫絛ataTask,然后對(duì)它進(jìn)行一系列操作(暫停、取消等),有很高的自定義性胀瞪。這里舉一個(gè)應(yīng)用dataTask的例子:在做即時(shí)搜索(就是輸入框的內(nèi)容改變的時(shí)候就去觸發(fā)一個(gè)網(wǎng)絡(luò)請(qǐng)求针余,搜索一次)的時(shí)候,在我們輸入的速度很快的時(shí)候凄诞,前一次的網(wǎng)絡(luò)請(qǐng)求我們就可以通過(guò)dataTask來(lái)取消掉圆雁,使性能更優(yōu);接下來(lái)我們進(jìn)一步深入探索AFNetworking是怎么實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的帆谍。如下圖:(兩張圖展示的是一個(gè)方法)
通過(guò)self.requestSerializer獲得request 這個(gè)方法里有一個(gè)亮點(diǎn)伪朽,就是通過(guò)kvo和kvc的技術(shù)為request動(dòng)態(tài)設(shè)置屬性值(allowsCellularAccess、cachePolicy汛蝙、HTTPShouldHandleCookies烈涮、HTTPShouldUsePipelining朴肺、networkServiceType、timeoutInterval)坚洽。感興趣的可以去仔細(xì)研究下這樣設(shè)計(jì)的好處宇挫。接下來(lái)我們看獲得dataTask和執(zhí)行回調(diào)的重要方法的實(shí)現(xiàn),如下圖:
由于AFHTTPSessionManager是繼承于AFURLSessionManager的,所以此方法是在AFURLSessionManager中實(shí)現(xiàn)的(同學(xué)們可以思考下這種設(shè)計(jì)的好處)酪术。接下來(lái)我們來(lái)看看為dataTask設(shè)置代理的方法到底做了什么,看下圖:
上圖中的方法為每個(gè)dataTask都設(shè)置了對(duì)應(yīng)的代理器瘪,代理的作用是:當(dāng)請(qǐng)求結(jié)束的時(shí)候根據(jù)dataTask找到對(duì)應(yīng)的delegate,然后由delegate來(lái)執(zhí)行完成回調(diào)或者失敗的回調(diào)绘雁。需要注意的是這里的delegate不是我們平常寫(xiě)代碼時(shí)候的那種屬性代理橡疼,這兒的‘delegate’只是跟代理的作用很像,所以叫做delegate庐舟,其實(shí)只是一種一一對(duì)應(yīng)的形式欣除,把dataTask對(duì)用的各種對(duì)調(diào)賦值給了‘delegate’,然后‘delegate’可以來(lái)幫助dataTask執(zhí)行回調(diào)(同學(xué)們可以思考下‘為什么不直接寫(xiě)一個(gè)子類(lèi)集成于dataTask然后為其添加一個(gè)代理屬性挪略,來(lái)實(shí)現(xiàn)真正的意義上的代理呢历帚?’)。到這里創(chuàng)建和配置dataTask已經(jīng)完成杠娱,接下來(lái)我們來(lái)看看請(qǐng)求完成的時(shí)候挽牢,AFN是怎么回調(diào)的,請(qǐng)看下圖:
從圖中可以看到正如我們上面提到的摊求,是根據(jù)delegate來(lái)完成回調(diào)的禽拔,讓我們接著看看[delegate URLSession:session task:task didCompleteWithError:error];這個(gè)方法里做了什么?由于方法中代碼太長(zhǎng)室叉,截圖不好截睹栖,因此下圖中只是請(qǐng)求沒(méi)有出錯(cuò)的情況下執(zhí)行回調(diào)的代碼:
以上便是我對(duì)AFNetworking的簡(jiǎn)單分析,可能有些理解不對(duì)之處茧痕,請(qǐng)大神指正R袄础!踪旷!