**放在最前:文章為本人學(xué)習(xí)隨筆蹋偏,若對您有幫助,不勝榮幸磁滚;若有錯漏歡迎評論區(qū)留言逼庞。**
一、框架解析
使用AFNetWorking 也已經(jīng)幾年了闺鲸,使用起來也順手筋讨,但是最值得我們學(xué)習(xí)的AFN 結(jié)構(gòu)設(shè)計思想,仍然是要努力探究的方向摸恍。先讓我們來學(xué)習(xí)下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];
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) - 簡書