溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解析AFNetworking框架的解讀

發(fā)布時間:2022-01-10 16:48:57 來源:億速云 閱讀:119 作者:柒染 欄目:數(shù)據(jù)庫

今天給大家介紹一下如何解析AFNetworking框架的解讀。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。

做ios開發(fā),AFNetworking 這個網(wǎng)絡(luò)框架肯定都非常熟悉,也許我們平時只使用了它的部分功能,而且我們對它的實現(xiàn)原理并不是很清楚,就好像總是有一團迷霧在眼前一樣。

接下來我們就非常詳細的來讀一讀這個框架的代碼,我們的目標(biāo)就是理解了它的思想之后,能夠明白我們的請求是如何實現(xiàn)的,我們的代碼哪里還需要進行改進,如果能夠更進一步,我們能夠總結(jié)出一套適合大部分應(yīng)用的網(wǎng)絡(luò)架構(gòu)思想。

能夠讓一些人從中受益。

我們先來看看整個框架的文件系統(tǒng),我們先不對每個文件的作用進行說明,在整個源碼解讀最后的一篇中我們會對整個框架進行總結(jié)。會有一張清晰的圖表來說明這個問題。

我們在看一個框架的時候呢,可以這樣先看,先看每個文件的頭文件,也就是.h文件

可以看到,有的頭文件是包含了別的頭文件的,在不考慮系統(tǒng)的頭文件的情況下,我們能夠發(fā)現(xiàn)一些比較獨立的類,從上圖中,我們可以看出

比較獨立的類有:

1.AFURLResponseSerialization.h

2.AFNetworkReachabilityManager.h

3.AFURLRequestSerialization.h

4.AFSecurityPolicy.h

下面就介紹AFNetworkReachabilityManager.h的內(nèi)容,這個是用來監(jiān)控網(wǎng)絡(luò)環(huán)境變化的類。

#import <SystemConfiguration/SystemConfiguration.h>

通過導(dǎo)入了這個頭文件,我們得知:網(wǎng)絡(luò)監(jiān)控的實現(xiàn)是依賴SystemConfiguration這個api的。說明這個api能夠提供這樣的功能,至少讓我們明白了我們平時都會導(dǎo)入它的一個用途。

如何解析AFNetworking框架的解讀

這是一個枚舉封裝,還是遵循一個使用枚舉的原則,當(dāng)滿足一個有限的并具有統(tǒng)一主題的集合的時候,我們就考慮枚舉。在這里作者是枚舉了4種類型。這幾種類型能夠滿足我們開發(fā)中大部分的功能,如果不滿足,可以自行進行擴展。

NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END

這個是為了swift的可選類型配添加的,在這兩個終點的內(nèi)容的參數(shù)默認都是nonnull的。

如何解析AFNetworking框架的解讀

這段文字是對這個類的說明。我們估且不去管它說了什么,在看看蘋果官方的

如何解析AFNetworking框架的解讀

這樣的內(nèi)容會出現(xiàn)在一個屬性或者方法的上方,目的是對其內(nèi)容的解釋。我看到這里就想到了我們平時的開發(fā),我們能夠把每段代碼都當(dāng)成是api的開發(fā),也把注 釋寫的詳細一點。曾經(jīng)看過兩種不同的說辭,一種是說把代碼注釋盡量少些,要求代碼簡介可讀性強。另一種是說注釋要詳細,著重考慮他人讀代碼的感受。個人感 覺還是寫詳細一點比較好,因為可能過一段時間之后,自己再去看自己當(dāng)時寫的代碼可能就不記得了。很有可能在寫這些繁瑣的注釋的過程中,能夠想到些什么,比 如如何合并掉一些沒必要的方法等等。

本類提供了四個只讀的屬性來讓我們獲取我們需要的內(nèi)容

1. 網(wǎng)絡(luò)狀態(tài)

2. 是否是可達的

3. 當(dāng)前連接是否是WWAN

4. 當(dāng)前連接是夠是WiFi

四個屬性均為只讀屬性,只給了用戶訪問權(quán),注意BOOL屬性一般是要寫getter方法的。

如何解析AFNetworking框架的解讀

作者使用了這個來分隔同一類中不同功能模塊。這個算是個人習(xí)慣問題吧。舉個平時開發(fā)的例子,在.m文件中我個人使用#pragma mark 分隔不同功能。

如何解析AFNetworking框架的解讀

提供了5中初始化方法,能夠滿足大部分的需求。

SCNetworkReachabilityRef 這個很重要,這個類的就是基于它開發(fā)的。

+ (instancetype)managerForDomain:(NSString *)domain; 監(jiān)聽制定domain的網(wǎng)絡(luò)狀態(tài)。

+ (instancetype)managerForAddress:(const void *)address; 監(jiān)聽某個socket地址的網(wǎng)絡(luò)狀態(tài),socket通信請看這篇文章: socket通信

如何解析AFNetworking框架的解讀

打開和關(guān)閉監(jiān)聽的方法。

如何解析AFNetworking框架的解讀

返回一個網(wǎng)絡(luò)狀態(tài)的本地語言的字符串。往往我們可以根據(jù)這個字符串來告訴用戶,當(dāng)前網(wǎng)絡(luò)發(fā)生了什么,當(dāng)然,也可以根據(jù)狀態(tài)自定義提示文字。

如何解析AFNetworking框架的解讀

設(shè)置網(wǎng)絡(luò)轉(zhuǎn)態(tài)改變的回調(diào),監(jiān)聽網(wǎng)絡(luò)改變的回調(diào)有兩種方式:

1.使用上邊的這個方法。

2.監(jiān)聽AFNetworkingReachabilityDidChangeNotification通知。

如何解析AFNetworking框架的解讀

這個是與網(wǎng)絡(luò)狀態(tài)變化相關(guān)的通知。接受的通知中會有一個userinfo 是一個NSDictionary 其中key就是

AFNetworkingReachabilityNotificationStatusItem 

這簡單的兩行代碼能夠告訴我們的是,我們平時的開發(fā)中 但凡設(shè)計到發(fā)通知的功能,我們應(yīng)該把通知的字符串封裝到一個專有的文件中,同時在文件內(nèi)部按不同模塊進行區(qū)分,當(dāng)然必要的注釋也很有必要。

ps: FOUNDATION_EXPORT 和#define 都能定義常量。FOUNDATION_EXPORT 能夠使用==進行判斷,效率略高。而且能夠隱藏定義細節(jié)(就是實現(xiàn)部分不在.中)

如何解析AFNetworking框架的解讀

對函數(shù):根據(jù)狀態(tài)獲取字符串  聲明。

好了,這個類的.h文件我們已經(jīng)非常相信的進行解讀了,我們并不是大概的說了下他提供的功能,而是通過讀每行代碼,我們能聯(lián)想到什么,什么東西能幫助我們更好的編程。

我們接著看 AFNetworkReachabilityManager.m 的內(nèi)容

如何解析AFNetworking框架的解讀

這幾個頭文件是系統(tǒng)庫,是為了后邊的 sockaddr_in6 / sockaddr_in 準(zhǔn)備的,不熟悉的可以看這篇文章 socket通信

如何解析AFNetworking框架的解讀

這幾個就沒什么好說的了,我們接著看

如何解析AFNetworking框架的解讀

這個方法是對.h 中最后一個方法的實現(xiàn)。指的我們注意的是NSLocalizedStringFromTable這個宏。為什么要注意它呢?

這就涉及到本地國際化的問題。所謂的國際化就是讓你的app能夠根據(jù)不同的語言顯示相對應(yīng)的語言。

*** 但這并不簡單,沒有經(jīng)驗的開發(fā)人員,一開始可能不會做這樣的設(shè)置,如果日后需要國際話了,在做就很麻煩了。所以說在開中,但凡使用到字符串的地方都要考慮語言的不同。不同的語言下,一個意思的表達所使用的字符串長度是不一樣的,這就影射出空間的寬度可能會不一樣。

好了,國際化的內(nèi)容就不說了,請自行搜索。

 1 /** 2  *  根據(jù)SCNetworkReachabilityFlags這個網(wǎng)絡(luò)標(biāo)記來轉(zhuǎn)換成我們在開發(fā)中經(jīng)常使用的網(wǎng)絡(luò)狀態(tài) 3      1.不能連接網(wǎng)絡(luò) 4      2.蜂窩連接 5      3.WiFi連接 6      4.未知連接 7  */ 8 static AFNetworkReachabilityStatus AFNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) { 9     10     // 是否能夠到達11     BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0);12     13     // 在聯(lián)網(wǎng)之前需要建立連接14     BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0);15     16     // 是否可以自動連接17     BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0));18     19     // 是否可以連接,在不需要用戶手動設(shè)置的前提下20     BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0);21     22     // 是否可以聯(lián)網(wǎng)的條件 1.能夠到達 2.不需要建立連接或者不需要用戶手動設(shè)置連接 就表示能夠連接到網(wǎng)絡(luò)23     BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction));24 25     AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusUnknown;26     if (isNetworkReachable == NO) {27         status = AFNetworkReachabilityStatusNotReachable;28     }29 #if    TARGET_OS_IPHONE30     else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) {31         status = AFNetworkReachabilityStatusReachableViaWWAN;32     }33 #endif34     else {35         status = AFNetworkReachabilityStatusReachableViaWiFi;36     }37 38     return status;39 }

這個方法根據(jù)SCNetworkReachabilityFlags這個標(biāo)記轉(zhuǎn)換成我們自定義的枚舉類型。至于轉(zhuǎn)換規(guī)則,上邊的代碼中注釋部分寫的很清楚。

*** 在這里不得不多說幾句,很多框架中都會把一個類中的私有方法寫成這樣。為什么呢? 我們在開發(fā)中經(jīng)常會寫成- (void)funcName; 這樣的私有方法。

我個人的意見是一個類中的私有方法寫成static void funcName() 這樣的c函數(shù)比較好。 

1. 在文件的最前方,比較容易查找

2. 可以適當(dāng)?shù)氖褂脙?nèi)聯(lián)函數(shù),提高效率。

如何解析AFNetworking框架的解讀

根據(jù)一個標(biāo)識 來處理Block和通知。保證兩者同一狀態(tài)。

如何解析AFNetworking框架的解讀

包含了 類中需要處理的屬性。

如何解析AFNetworking框架的解讀

來看這個最基本的初始化方法,初始化了自身的屬性。

CFRetain()后要記得CFRelease().

如何解析AFNetworking框架的解讀

通過一個socket地址來初始化。 首先新建 SCNetworkReachabilityRef 對象,然后調(diào)用initWithReachability: 方法。記得手動管理內(nèi)存。

如何解析AFNetworking框架的解讀

這個方法基本同上。

綜合上邊兩個方法,我們發(fā)現(xiàn) SCNetworkReachabilityRef 有兩個創(chuàng)建方法:

1. SCNetworkReachabilityCreateWithName 

2. SCNetworkReachabilityCreateWithAddress

如何解析AFNetworking框架的解讀

由于IPv6 是ios9和os_x 10.11后邊推出的,所有要進行版本判斷。這禮拜呢設(shè)計到的socket的知識,請看 socket通信

通過這段代碼我們能學(xué)到什么呢?

1,方法的創(chuàng)建也是有順序的,可以使用函數(shù)訪問函數(shù)的思想。

2. @if 這樣的預(yù)編譯指令能夠替換掉代碼中部分if else 。好處就是代碼會不會被編譯的區(qū)別。

如何解析AFNetworking框架的解讀

單例的寫法。

如何解析AFNetworking框架的解讀

對需要釋放時,做一些處理。

如何解析AFNetworking框架的解讀

這個是.h文件暴露出來的3個BOOL 屬性的getter方法,注意,由于我們在@property中定義了getter方法,所以getter方法就要寫成我們定義的那種。

從這3個方法中也能看出,函數(shù)嵌套的思想還是很重要,要想做到這一點,只能是多想才行。

如何解析AFNetworking框架的解讀

這個算是這個類的核心方法,設(shè)置監(jiān)聽網(wǎng)咯監(jiān)聽。

我們先來了解下基礎(chǔ)知識。

SCNetworkReachabilityContext

點進去,會發(fā)現(xiàn)這是一個結(jié)構(gòu)體,一般c語言的結(jié)構(gòu)體是對要保存的數(shù)據(jù)的一種描述

如何解析AFNetworking框架的解讀

1. 第一個參數(shù)接受一個signed long 的參數(shù)

2. 第二個參數(shù)接受一個void * 類型的值,相當(dāng)于oc的id類型,void * 可以指向任何類型的參數(shù)

3. 第三個參數(shù) 是一個函數(shù) 目的是對info做retain操作,

4. 第四個參數(shù)是一個函數(shù),目的是對info做release操作

5. 第五個參數(shù)是 一個函數(shù),根據(jù)info獲取Description字符串

在這里我們要攜帶的這個info就是下邊的這個block

 1 __weak __typeof(self)weakSelf = self; 2     AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) { 3         __strong __typeof(weakSelf)strongSelf = weakSelf; 4  5         strongSelf.networkReachabilityStatus = status; 6         if (strongSelf.networkReachabilityStatusBlock) { 7             strongSelf.networkReachabilityStatusBlock(status); 8         } 9 10     };

retain和release 函數(shù)是下邊的這兩個函數(shù)

1 static const void * AFNetworkReachabilityRetainCallback(const void *info) {2     return Block_copy(info);3 }4 5 static void AFNetworkReachabilityReleaseCallback(const void *info) {6     if (info) {7         Block_release(info);8     }9 }

設(shè)置網(wǎng)絡(luò)監(jiān)控分為下邊幾個步驟:

1.我們先新建上下文

1 SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL};

2.設(shè)置回調(diào)

1 SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context);

其中這個AFNetworkReachabilityCallback 是這樣被定義的一個函數(shù)

typedef void (*SCNetworkReachabilityCallBack)    (
                        SCNetworkReachabilityRef            target,
                        SCNetworkReachabilityFlags            flags,                        void                 *    __nullable    info
                        );

在本類中

1 static void AFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) {2     AFPostReachabilityStatusChange(flags, (__bridge AFNetworkReachabilityStatusBlock)info);3 }

3.加入RunLoop池

1 SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);

其中CFRunLoopGetMain()代表主RunLoop

ok,差不多已經(jīng)完成

如何解析AFNetworking框架的解讀

在異步線程 發(fā)送一次當(dāng)前的網(wǎng)絡(luò)狀態(tài)。

 如何解析AFNetworking框架的解讀

停止網(wǎng)絡(luò)監(jiān)控

如何解析AFNetworking框架的解讀

這兩個方法沒什么好說的了,一個是getter 一個是setter 

如何解析AFNetworking框架的解讀

注冊鍵值依賴,這個可能大家平時用的比較少。可以了解一下

比如說一個類User中有兩個屬性

如何解析AFNetworking框架的解讀 

還有一個卡片的類card

如何解析AFNetworking框架的解讀

 我們寫一個info的setter 和 getter  方法,

如何解析AFNetworking框架的解讀

 1 @interface User :NSObject 2 @property (nonatomic,copy)NSString *name; 3 @property (nonatomic,assign)NSUInteger age; 4 @end 5  6  7  8 @interface card :NSObject 9 @property (nonatomic,copy)NSString *info;10 @property (nonatomic,strong)User *user;11 @end12 @implementation card13 14 - (NSString *)info {15     return [NSString stringWithFormat:@"%@/%lu",_user.name,(unsigned long)_user.age];16 }17 - (void)setInfo:(NSString *)info {18     19     NSArray *array = [info componentsSeparatedByString:@"/"];20     _user.name = array[0];21     _user.age = [array[1] integerValue];22     23 }24 25 + (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key {26     NSSet * keyPaths = [super keyPathsForValuesAffectingValueForKey:key];27     NSArray * moreKeyPaths = nil;28 29     if ([key isEqualToString:@"info"])30     {31         moreKeyPaths = [NSArray arrayWithObjects:@"user.name", @"user.age", nil];32     }33 34     if (moreKeyPaths)35     {36         keyPaths = [keyPaths setByAddingObjectsFromArray:moreKeyPaths];37     }38     39     return keyPaths;40 }41 42 @end

gh.dokee.cn/article/content-2292769-34004.html
gh.dokee.cn/article/content-2292768-34004.html
gh.dokee.cn/article/content-2292766-34004.html
gh.dokee.cn/article/content-2292765-34004.html
gh.dokee.cn/article/content-2292764-34004.html
gh.dokee.cn/article/content-2292763-34004.html
gh.dokee.cn/article/content-2292762-34004.html
gh.dokee.cn/article/content-2292761-34004.html
gh.dokee.cn/article/content-2292760-34004.html
gh.dokee.cn/article/content-2292759-34004.html
gh.dokee.cn/article/content-2292758-34004.html
bbs.open.qq.com/thread-15334805-1-1.html
bbs.open.qq.com/thread-15335348-1-1.html
bbs.open.qq.com/thread-15335576-1-1.html
bbs.open.qq.com/thread-15335715-1-1.html
http://bbs.open.qq.com/thread-15335916-1-1.html
http://bbs.open.qq.com/thread-15335876-1-1.html
http://bbs.open.qq.com/thread-15336398-1-1.html
http://bbs.open.qq.com/thread-15336484-1-1.html
http://bbs.open.qq.com/thread-15336547-1-1.html
http://bbs.open.qq.com/thread-15336614-1-1.html
http://bbs.open.qq.com/thread-15336697-1-1.html
http://bbs.open.qq.com/thread-15336806-1-1.html
http://bbs.open.qq.com/thread-15340763-1-1.html
www.baiyewang.com/s4209086.html
http://bl.gamebbs.qq.com/forum.php?mod=viewthread&tid=11675819
http://bbs.open.qq.com/thread-15343974-1-1.html
http://bbs.open.qq.com/thread-15344107-1-1.html
http://caimi68.lofter.com/post/1e3e0a7a_bbb5392
http://caimi68.lofter.com/post/1e3e0a7a_bbb539f
http://caimi68.lofter.com/post/1e3e0a7a_bbb539e
http://caimi68.lofter.com/post/1e3e0a7a_bbb539d
http://caimi68.lofter.com/post/1e3e0a7a_bbb539c
http://caimi68.lofter.com/post/1e3e0a7a_bbb53a0
http://caimi68.lofter.com/post/1e3e0a7a_bbb53a1
http://caimi68.lofter.com/post/1e3e0a7a_bbb53a2
http://caimi68.lofter.com/post/1e3e0a7a_bbb53a4
http://bbs.open.qq.com/thread-15345770-1-1.html
http://bbs.open.qq.com/thread-15345813-1-1.html
http://bbs.open.qq.com/thread-15345854-1-1.html
http://bbs.open.qq.com/thread-15345888-1-1.html
http://bbs.open.qq.com/thread-15345937-1-1.html
http://bbs.open.qq.com/thread-15346013-1-1.html
http://bbs.open.qq.com/thread-15346046-1-1.html
http://bbs.open.qq.com/thread-15346098-1-1.html
http://bbs.open.qq.com/thread-15346138-1-1.html
http://bbs.open.qq.com/thread-15346194-1-1.html
http://bbs.open.qq.com/thread-15346240-1-1.html
http://bbs.open.qq.com/thread-15346345-1-1.html
http://g.jandan.net/s/6319
http://g.jandan.net/s/6320
http://g.jandan.net/s/6321
http://g.jandan.net/s/6322
http://g.jandan.net/s/6323

以上就是如何解析AFNetworking框架的解讀的全部內(nèi)容了,更多與如何解析AFNetworking框架的解讀相關(guān)的內(nèi)容可以搜索億速云之前的文章或者瀏覽下面的文章進行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI