本篇文章介紹傳說中的 AFN 框架的使用
創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|成都網(wǎng)站改版|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋戶外休閑椅等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身開發(fā)品質(zhì)網(wǎng)站。AFNetworking是iOS開發(fā)中最廣泛使用的開源項(xiàng)目之一,是最活躍最有影響力的開源項(xiàng)目之一。
源自一個(gè)LBS項(xiàng)目,成功代替了ASIHTTPRequest成為了主流的網(wǎng)絡(luò)解決方案。
AFN將NSURLConnection與NSOperation結(jié)合(內(nèi)部使用GCD),并在2.0版本開始兼容NSURLSession
使用AFN發(fā)送請(qǐng)求可以使用兩種方式:
AFHTTPRequestOperationManager和AFURessionManager
如果是數(shù)據(jù)任務(wù)推薦使用第一種,如果是下載/上傳任務(wù)推薦使用第二種
使用AFHTTPRequestOperationManager
這個(gè)類的對(duì)象,能夠非常方便的創(chuàng)建并發(fā)起各種HTTP請(qǐng)求
對(duì)象的創(chuàng)建:
+ (instancetype)manager
1)發(fā)起GET請(qǐng)求:
- (nullable AFHTTPRequestOperation *)GET:(NSString *)URLString parameters:(nullable id)parameters success:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , id responseObject ))success failure:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , NSError *error ))failure
參數(shù)URLString:請(qǐng)求的url
參數(shù)parameters:參數(shù)字典,GET請(qǐng)求的參數(shù)可以放在URL中也可以放在這里
使用@{key1:value1, key2:value2, ...} 代理 key1=value1&key2=value2&...
參數(shù)success:請(qǐng)求成功時(shí),執(zhí)行的block
參數(shù)failure:請(qǐng)求失敗時(shí),執(zhí)行的block
返回值:AFHTTPRequestOperation請(qǐng)求任務(wù)對(duì)象
如:
或?qū)?shù)放在parameters參數(shù)上
2)發(fā)起POST請(qǐng)求
- (nullable AFHTTPRequestOperation *)POST:(NSString *)URLString parameters:(nullable id)parameters success:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , id responseObject ))success failure:(nullable void ( ^ ) ( AFHTTPRequestOperation *operation , NSError *error ))failure
如:
請(qǐng)求對(duì)象的序列化工具
功能一:完成請(qǐng)求對(duì)象的功能
使用AFHTTPRequestOperationManager發(fā)送請(qǐng)求參數(shù)是NSURL而不是NSURLRequest;之前介紹過,NSURLRequest中并不僅僅是NSURL,還可以:設(shè)置請(qǐng)求頭參數(shù)、設(shè)置緩存策略、設(shè)置請(qǐng)求超時(shí)等
這些功能由請(qǐng)求對(duì)象的序列化工具對(duì)象完成
功能二:請(qǐng)求的參數(shù)自動(dòng)序列化
除了完成這些本屬于NSURLRequest的任務(wù)外,還能實(shí)現(xiàn)將請(qǐng)求的參數(shù)(URL參數(shù)及請(qǐng)求體參數(shù))進(jìn)行序列化,由于很少服務(wù)器上請(qǐng)求要求傳遞JSON/XML數(shù)據(jù),所以這個(gè)功能很少使用
父類:AFHTTPRequestSerializer
子類:AFJSONRequestSerializer(默認(rèn)) AFPropertyListRequestSerializer ...
1)設(shè)置請(qǐng)求頭的參數(shù)
- (void)setValue:(nullable NSString *)valueforHTTPHeaderField:(NSString *)field - (nullable NSString *)valueForHTTPHeaderField:(NSString *)field @property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders
如:發(fā)送GET請(qǐng)求獲得用戶信息,要求傳入header參數(shù) Authorization=tokenID xxxxxx
2)設(shè)置緩存策略
@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy
3)通過序列化工具,可以設(shè)置請(qǐng)求超時(shí)
@property (nonatomic, assign) NSTimeInterval timeoutInterval
響應(yīng)對(duì)象的反序列化工具
功能一:將響應(yīng)數(shù)據(jù)反序列化
也就是說,如果接受到一個(gè)JSON數(shù)據(jù),它能幫助我們直接反序列化為OC基本數(shù)據(jù)對(duì)象
功能二:通過一些屬性的設(shè)定,可以限制接收哪些想要的響應(yīng)數(shù)據(jù)
父類:AFHTTPResponseSerializer
子類:AFJSONResponseSerializer AFPropertyListResponseSerializer AFImageResponseSerializer
AFXMLParserResponseSerializer AFXMLDocumentResponseSerializer
默認(rèn)是AFJSONResponseSerializer,因?yàn)榇蠖鄶?shù)的請(qǐng)求都是JSON類型
1)設(shè)置能夠正確接收的響應(yīng)數(shù)據(jù)類型(MIMETYPE):
@property (nonatomic, copy, nullable) NSSet *acceptableContentTypes
2)設(shè)置能夠正確接收的狀態(tài)碼:
@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes
AFURLSessionManager
提供了對(duì)NSURLSession操作的封裝
創(chuàng)建數(shù)據(jù)任務(wù):
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , id responseObject , NSError *error ))completionHandler
manager的屬性:
// 完成block執(zhí)行所在任務(wù)隊(duì)列 @property (nonatomic, strong, nullable) dispatch_queue_t completionQueue // 請(qǐng)求執(zhí)行所在任務(wù)隊(duì)列 @property (readonly, nonatomic, strong) NSOperationQueue *operationQueue // 響應(yīng)對(duì)象的序列化工具 @property (nonatomic, strong) id<AFURLResponseSerialization> responseSerializer ...
下載任務(wù)及上傳任務(wù)在后面的文章介紹
AFNetworkingActivityIndicatorManager
用于方便地管理狀態(tài)欄上的網(wǎng)絡(luò)活動(dòng)指示器
獲得全局對(duì)象:
+ (instancetype)sharedManager
網(wǎng)絡(luò)活動(dòng)指示器的顯示狀態(tài):
@property (nonatomic, assign, getter=isEnabled) BOOL enabled @property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible
為了方便正確地控制指示器狀態(tài),在管理對(duì)象中包含一個(gè)整型的引用計(jì)數(shù),當(dāng)>0時(shí)顯示,==0時(shí)不顯示
在發(fā)起網(wǎng)絡(luò)請(qǐng)求前,使用下面的方法,對(duì)引用計(jì)數(shù)+1:
- (void)incrementActivityCount
在完成網(wǎng)絡(luò)請(qǐng)求后,使用下面的方法,對(duì)引用計(jì)數(shù)-1:
- (void)decrementActivityCount
AFNetworkReachabilityManager
用于檢測(cè)網(wǎng)絡(luò)的可達(dá)性,如:
[[AFNetworkReachabilityManager sharedManager] startMonitoring]; [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusNotReachable: NSLog(@"無網(wǎng)絡(luò)"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WiFi網(wǎng)絡(luò)”); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"無線網(wǎng)絡(luò)”); break; default: break; } }];
UIKit的分類
AFN框架和SDWebImage類似,也提供了很多UI控件的分類
AFNetworking源碼中的一些常用技巧
所有的單例都是用dispatch_once創(chuàng)建,保證只執(zhí)行一次
block中對(duì)self關(guān)鍵字的訪問,如代碼段:
__weak __typeof(self)weakSelf = self; self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ __strong __typeof(weakSelf)strongSelf = weakSelf; }];
第一個(gè)weakSelf是為了block中不持有self,避免出現(xiàn)循環(huán)引用
第二個(gè)strongSelf是為了保證在block執(zhí)行過程中,這個(gè)self不會(huì)被釋放
常用類的說明
AFURLRequestOperation繼承自NSOperation,描述網(wǎng)絡(luò)請(qǐng)求任務(wù)對(duì)象
管理著NSURLConnection,并實(shí)現(xiàn)了其代理方法
AFHTTPRequestOperation又是AFURLRequestOperation的子類
包含請(qǐng)求任務(wù)成功或失敗時(shí)需要執(zhí)行的block(實(shí)際上這些block是在代理方法中被調(diào)用)
AFHTTPRequestOperationManager用于快速創(chuàng)建AFHTTPRequestOperation并添加到任務(wù)隊(duì)列中
AFURLRequestSerialization用于幫助構(gòu)建NSURLRequest
格式化參數(shù):
一般我們請(qǐng)求都會(huì)按key=value的方式帶上各種參數(shù),GET方法參數(shù)直接加在URL上,POST方法放在body上,NSURLRequest沒有封裝好這個(gè)參數(shù)的解析,只能我們自己拼好字符串。AFNetworking提供了接口,讓參數(shù)可以是NSDictionary, NSArray, NSSet這些類型,再由內(nèi)部解析成字符串后賦給NSURLRequest。
轉(zhuǎn)化過程大致是這樣的:
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享文章:iOS網(wǎng)絡(luò)開發(fā)(7)大牛們的杰作AFNetworking-創(chuàng)新互聯(lián)
文章鏈接:http://jinyejixie.com/article40/ejoeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、軟件開發(fā)、做網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站制作、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容