AFNetworking源碼閱讀筆記(四)

三瞄崇、Reachability部分

Reachability是用來(lái)檢測(cè)網(wǎng)絡(luò)連接狀態(tài)的呻粹,主要功能由AFNetworkReachabilityManager類(lèi)來(lái)實(shí)現(xiàn)。下面就來(lái)具體分析一下AFNetworkReachabilityManager類(lèi)的源碼苏研。由于這個(gè)類(lèi)功能比較單一等浊,所以代碼量相對(duì)于其他部分也更為簡(jiǎn)潔。

同樣楣富,下面通過(guò)一個(gè)調(diào)用使用來(lái)分析其工作原理:

由注解可看出其是基于系統(tǒng)的Reachability實(shí)現(xiàn)凿掂∽可以用來(lái)定位后臺(tái)網(wǎng)絡(luò)連接失敗的信息忍捡,或是用來(lái)重啟一個(gè)請(qǐng)求。但是不能用來(lái)阻止一個(gè)已經(jīng)發(fā)起的請(qǐng)求。

現(xiàn)在開(kāi)始分析具體代碼,先看一下工具類(lèi)的初始化:

看到第一步是初始化一個(gè)系統(tǒng)的sockaddr_in類(lèi)型的地址横蜒,并指明address.sin_family=AF_INET其家族地址協(xié)議簇為T(mén)CP/IP協(xié)議類(lèi)型。參見(jiàn)詳情

繼續(xù)深入:

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address)通過(guò)前一步傳入的地址來(lái)測(cè)試連接狀態(tài),reachability用來(lái)保存創(chuàng)建測(cè)試連接返回的引用渠羞。在接下來(lái)的- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability方法中保存這個(gè)引用_networkReachability = CFRetain(reachability)并設(shè)置初始值self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown參看詳情

就此工具類(lèi)的初始化完成,接著分析調(diào)用[manager startMonitoring]

可看到在每次進(jìn)入監(jiān)視時(shí)摘投,如果之前設(shè)置過(guò)監(jiān)聽(tīng),都先停止之前的監(jiān)視[self stopMonitoring]

看到stopMonitoring是調(diào)用SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes)這個(gè)系統(tǒng)方法實(shí)現(xiàn)的体箕。

緊接著

設(shè)置網(wǎng)絡(luò)狀態(tài)變化時(shí)的回調(diào)娃兽,可看出每次網(wǎng)絡(luò)狀態(tài)變化時(shí)將重新設(shè)置網(wǎng)絡(luò)狀態(tài)strongSelf.networkReachabilityStatus = status并調(diào)用strongSelf.networkReachabilityStatusBlock(status)玛荞。

緊接著創(chuàng)建網(wǎng)絡(luò)狀態(tài)監(jiān)控上下文

設(shè)置contextinfocallback塞蹭,AFNetworkReachabilityRetainCallbackAFNetworkReachabilityReleaseCallback只是對(duì)傳入的info進(jìn)行引用計(jì)數(shù)管理。

接著調(diào)用系統(tǒng)方法設(shè)置網(wǎng)絡(luò)狀態(tài)變化時(shí)調(diào)用的block

當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí)率碾,將調(diào)用AFNetworkReachabilityCallback進(jìn)而調(diào)用AFPostReachabilityStatusChange再調(diào)用之前傳進(jìn)去的開(kāi)發(fā)者設(shè)置的AFNetworkReachabilityStatusBlock類(lèi)型回調(diào)仔粥。

看看AFPostReachabilityStatusChange中是通過(guò)AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags)這個(gè)方法獲取狀態(tài)的:

這個(gè)方法可看出flag是系統(tǒng)返回的網(wǎng)絡(luò)狀態(tài),這個(gè)函數(shù)主要是將系統(tǒng)提供的復(fù)雜的狀態(tài)轉(zhuǎn)化為對(duì)應(yīng)的框架提供的簡(jiǎn)潔的狀態(tài)兼搏。

main runloop模式中開(kāi)始監(jiān)控網(wǎng)絡(luò)狀態(tài)

接著獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài)并回調(diào)

這就是[manager startMonitoring]中所做的事氧苍。

緊接著這一步

也就是設(shè)置網(wǎng)絡(luò)狀態(tài)變化時(shí)要調(diào)用的block罢荡。

最后調(diào)用[manager stopMonitoring]差购,之前分析過(guò)解取。

就此一次對(duì)Reachability的使用結(jié)束。

縱觀源碼可看出AFNetworkReachabilityManager其實(shí)是對(duì)系統(tǒng)自帶的c語(yǔ)言的SCNetworkReachability的一個(gè)OC語(yǔ)言的封裝摔踱,提供了OC簡(jiǎn)便使用的接口。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市络断,隨后出現(xiàn)的幾起案子锥惋,更是在濱河造成了極大的恐慌仍秤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件我抠,死亡現(xiàn)場(chǎng)離奇詭異苇本,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)屿良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)圈澈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尘惧,你說(shuō)我怎么就攤上這事康栈。” “怎么了喷橙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵啥么,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贰逾,道長(zhǎng)悬荣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任疙剑,我火速辦了婚禮氯迂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘言缤。我一直安慰自己嚼蚀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布管挟。 她就那樣靜靜地躺著轿曙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导帝,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天守谓,我揣著相機(jī)與錄音,去河邊找鬼您单。 笑死斋荞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的睹限。 我是一名探鬼主播譬猫,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼羡疗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起别洪,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叨恨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挖垛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痒钝,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年痢毒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了送矩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哪替,死狀恐怖栋荸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凭舶,我是刑警寧澤晌块,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站帅霜,受9級(jí)特大地震影響匆背,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身冀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一钝尸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搂根,春花似錦珍促、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春沐悦,著一層夾襖步出監(jiān)牢的瞬間成洗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工藏否, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶殃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓副签,卻偏偏與公主長(zhǎng)得像遥椿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淆储,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348