三瞄崇、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è)置context的info為callback塞蹭,AFNetworkReachabilityRetainCallback和AFNetworkReachabilityReleaseCallback只是對(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)便使用的接口。