AFN 框架解析及使用

**放在最前:文章為本人學(xué)習(xí)隨筆蹋偏,若對您有幫助,不勝榮幸磁滚;若有錯漏歡迎評論區(qū)留言逼庞。**

一、框架解析

使用AFNetWorking 也已經(jīng)幾年了闺鲸,使用起來也順手筋讨,但是最值得我們學(xué)習(xí)的AFN 結(jié)構(gòu)設(shè)計思想,仍然是要努力探究的方向摸恍。先讓我們來學(xué)習(xí)下AFN的整體結(jié)構(gòu)是怎樣的吧悉罕,見圖思義:


AFN結(jié)構(gòu)圖

1、AFHTTPSessionManager?

負(fù)責(zé)發(fā)送網(wǎng)絡(luò)請求及相應(yīng)的處理立镶,其調(diào)用棧如下:

- [AFHTTPSessionManager GET:parameters:process:success:failure:] ?

- [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:] // 返回 NSURLSessionDataTask ?*1

-[AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:] // 返回 NSMutableURLRequest?

????- [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:] // 返回 NSURLSessionDataTask *2

????- [NSURLSession dataTaskWithRequest:] // 返回 NSURLSessionDataTask *3

????- [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:] - [AFURLSessionManagerTaskDelegate init]

????- [AFURLSessionManager setDelegate:forTask:]

????- [NSURLSessionDataTask resume]

在這里 *1 *2 *3?處返回的是同一個 data task壁袄,我們可以看到,在?#3?處調(diào)用的方法 即為NSURLSession 的請求回調(diào)媚媒,我們再調(diào)用?- resume?方法執(zhí)行請求嗜逻,并在事件執(zhí)行時通知代理?AFURLSessionManagerTaskDelegate

如上簡單一個GET請求示例如下:

[[AFAppDotNetAPIClient sharedClient] GET:@"stream/0/posts/stream/global" parameters:nil progress:nil success:^(NSURLSessionDataTask * __unused task, id JSON) {? ?

?NSArray *postsFromResponse = [JSON valueForKeyPath:@"data"]; ? ? ? ? NSMutableArray *mutablePosts = [NSMutableArray arrayWithCapacity:[postsFromResponse count]];? ? ? ?

for (NSDictionary *attributes in postsFromResponse) {

? ? ? ? Post *post = [[Post alloc] initWithAttributes:attributes];? ? ? ? ?

? ? ? ? [mutablePosts addObject:post];? ? ? ? }? ? ?

? if (block) {? ? ? ? ?

? block([NSArray arrayWithArray:mutablePosts], nil);? ? ?

? }

? ? } failure:^(NSURLSessionDataTask *__unused task, NSError *error) {? ?

? ? if (block) {? ? ?

? ? ? block([NSArray array], error);? ?

? ? }? ? }];

2、AFNetworkReachabilityManager

實時監(jiān)測網(wǎng)絡(luò)狀態(tài)的工具類缭召,另系統(tǒng)自帶Reachability 也可

3栈顷、AFSecurityPolicy :

網(wǎng)絡(luò)安全的工具類,主要針對HTTPS服務(wù)嵌巷;

typedef NS_ENUM(NSUInteger,AFSSLPinningMode){ ? ? ? ? ? ? ? ? ? ?AFSSLPinningModeNone, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AFSSLPinningModePublicKey, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AFSSLPinningModeCertificate};

主要根據(jù)?AFSSLPinningMode 設(shè)置https請求驗證類型妨蛹,驗證底層為系統(tǒng)Security框架;

4晴竞、AFURLRequestSerialization:

序列化工具類蛙卤,封裝NSMutableRequest,上傳的數(shù)據(jù)轉(zhuǎn)換成JSON格式

5噩死、AFURLResponseSerialization:?

AFURLResponseSerialization主要負(fù)責(zé)對網(wǎng)絡(luò)請求回來的響應(yīng)報文數(shù)據(jù)進(jìn)行反序列化

下面是AFHTTPResponseSerializer的相關(guān)屬性:

@interface AFHTTPResponseSerializer : NSObject ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@property (nonatomic, assign) NSStringEncoding stringEncoding; //文本編碼@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes; //允許的http狀態(tài)碼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@property (nonatomic, copy, nullable) NSSet *acceptableContentTypes; //允許的content-type類型@end

stringEncoding屬性是文本編碼方式颤难,用于響應(yīng)的報文數(shù)據(jù)反序列化成字符串。acceptableStatusCodes是一個集合已维,表示客戶端可以接受的報文數(shù)據(jù)的http狀態(tài)碼行嗤。acceptableContentTypes是一個集合,表示客戶端可以接受的報文數(shù)據(jù)的content-type類型垛耳。

自帶的各個解析器

以下解析器都集成自AFHTTPResponseSerializer 的子類不同類型對應(yīng)不同的解析方法栅屏,主要方法:

- (id)responseObjectForResponse:(NSURLResponse *)response

?? ? ? ? ? ? ? ? ? ? ? ? ? data:(NSData *)data

? ? ? ? ? ? ? ? ? ? ? ? ? error:(NSError *__autoreleasing*)error

AFJSONResponseSerializer

acceptTypes:

?[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];

主要方法:

[NSJSONSerializationJSONObjectWithData:dataoptions:self.readingOptionserror:&serializationError]

AFXMLParserResponseSerializer

acceptTypes:?

?[[NSSet alloc] initWithObjects:@"application/xml",@"text/xml",nil];

主要方法:

[[NSXMLParser alloc] initWithData:data]

AFXMLDocumentResponseSerializer

acceptTypes:

?[[NSSet alloc] initWithObjects:@"application/xml",@"text/xml",nil];

主要方法:

[[NSXMLDocument alloc] initWithData:data options:self.options error:&serializationError];

AFPropertyListResponseSerializer

acceptTypes:

?[[NSSet alloc] initWithObjects:@"application/x-plist", nil];

主要方法:

[NSPropertyListSerialization propertyListWithData:data options:self.readOptions format:NULL error:&serializationError];

AFImageResponseSerializer

acceptTypes:

[[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil];

主要方法:

?CoreGraphics框架下 CGImageRefimageRef 飘千、GDataProviderRef

AFCompoundResponseSerializer

混合解析器,初始化方法如下

+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers {

? ? AFCompoundResponseSerializer *serializer = [[self alloc] init];

? ? serializer.responseSerializers= responseSerializers;

? ? return serializer;

}

7栈雳、UIKit分類

常用分類 有

?UIButton+AFNetworking 护奈、?UIImageView+AFNetworking、UIImage+AFNetworking

二哥纫、基本使用

1霉旗、POST/GET/DELETE/PATCH/PUT/Download/Upload

1)初始化設(shè)置相關(guān)

?NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [configuration setTLSMinimumSupportedProtocol:kTLSProtocol12];?//協(xié)議類型 ?? ? ? ? ? ? ? ? manager=[manager initWithBaseURL:[NSURL URLWithString:urlString] sessionConfiguration:configuration]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)置證書策略 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NSData *certData = [NSData dataWithContentsOfFile:cerPath]; ? ? ? ? ? ? ? ?securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];? //AFSSLPinningModeNone? ? ? ? //validatesDomainName 是否需要驗證域名,默認(rèn)為YES蛀骇;? ? ? ? securityPolicy.validatesDomainName = YES;?? ? ? ?? ? ? ? securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:certData,nil]; ? ? ? ? ?//禁用http響應(yīng)緩存 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[manager setDataTaskWillCacheResponseBlock:nil];

2) 序列化

manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFJSONResponseSerializer serializer];

manager.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"application/json",@"application/octet-stream",@"text/plain",@"multipart/form-data",@"text/html,@"text/json", nil];

//語言化設(shè)置 [manager.requestSerializersetValue:languageCodeforHTTPHeaderField:@"lang"];

//超時設(shè)置

?[manager.requestSerializer setTimeoutInterval:self.requestTimeoutInterval];

發(fā)起請求

3厌秒、斷點續(xù)傳

斷點續(xù)傳,主要是預(yù)先創(chuàng)建好一個空文件擅憔,然后邊寫邊提交或下載并且記好最后位置即可鸵闪;具體可見參考4;

三暑诸、圖片下載管理機制

AFN 提供了完整的圖片下載及緩存機制岛马,

1、AFImageDownloader : 圖片下載器屠列,主要通過?AFImageDownloaderMergedTask 類管理下載任務(wù)

2、AFAutoPurgingImageCache:圖片緩存 伞矩,主要是根據(jù)id去寫入和取出笛洛,寫入是通過串行隊列和柵欄加鎖的形式防止寫入的安全性問題。

參考:

1乃坤、AFNetworking 概述:https://draveness.me/afnetworking1/

2苛让、AFNetworking 3.1.0 源碼解讀:http://www.reibang.com/p/c36159094e24

3、?iOS源碼解析—AFNetworking(ResponseSerializer) - 簡書

4湿诊、?iOS斷點續(xù)傳和后臺下載(基于AFNetworking) - 簡書

5狱杰、AFImageDownloader

6、AFNetworking 3.0 源碼解讀(七)之 AFAutoPurgingImageCache - 簡書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厅须,一起剝皮案震驚了整個濱河市仿畸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朗和,老刑警劉巖错沽,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眶拉,居然都是意外死亡千埃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門忆植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來放可,“玉大人谒臼,你說我怎么就攤上這事∫铮” “怎么了蜈缤?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長备韧。 經(jīng)常有香客問我劫樟,道長,這世上最難降的妖魔是什么织堂? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任叠艳,我火速辦了婚禮,結(jié)果婚禮上易阳,老公的妹妹穿的比我還像新娘附较。我一直安慰自己,他們只是感情好潦俺,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布拒课。 她就那樣靜靜地躺著,像睡著了一般事示。 火紅的嫁衣襯著肌膚如雪早像。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天肖爵,我揣著相機與錄音卢鹦,去河邊找鬼。 笑死劝堪,一個胖子當(dāng)著我的面吹牛冀自,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秒啦,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼熬粗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了余境?” 一聲冷哼從身側(cè)響起驻呐,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芳来,沒想到半個月后暴氏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绣张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年答渔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥涵。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡沼撕,死狀恐怖宋雏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情务豺,我是刑警寧澤磨总,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站笼沥,受9級特大地震影響蚪燕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奔浅,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一馆纳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汹桦,春花似錦鲁驶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至督禽,卻和暖如春脆霎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狈惫。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工睛蛛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虱岂。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像菠红,于是被迫代替她去往敵國和親第岖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350