溫馨提示×

溫馨提示×

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

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

iOS網(wǎng)絡(luò)開發(fā)(7)大牛們的杰作AFNetworking

發(fā)布時(shí)間:2020-07-17 06:59:14 來源:網(wǎng)絡(luò) 閱讀:1971 作者:ymanmeng123 欄目:移動(dòng)開發(fā)

本篇文章介紹傳說中的  AFN 框架的使用


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ā)送請求可以使用兩種方式:

    AFHTTPRequestOperationManager和AFURessionManager

    如果是數(shù)據(jù)任務(wù)推薦使用第一種,如果是下載/上傳任務(wù)推薦使用第二種



  • 使用AFHTTPRequestOperationManager

這個(gè)類的對象,能夠非常方便的創(chuàng)建并發(fā)起各種HTTP請求

對象的創(chuàng)建:

 + (instancetype)manager


1)發(fā)起GET請求:

- (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:請求的url

     參數(shù)parameters:參數(shù)字典,GET請求的參數(shù)可以放在URL中也可以放在這里

                    使用@{key1:value1, key2:value2, ...} 代理 key1=value1&key2=value2&...

     參數(shù)success:請求成功時(shí),執(zhí)行的block

     參數(shù)failure:請求失敗時(shí),執(zhí)行的block

     返回值:AFHTTPRequestOperation請求任務(wù)對象

    

    如:

    iOS網(wǎng)絡(luò)開發(fā)(7)大牛們的杰作AFNetworking

    或?qū)?shù)放在parameters參數(shù)上

    iOS網(wǎng)絡(luò)開發(fā)(7)大牛們的杰作AFNetworking



2)發(fā)起POST請求

- (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

    如:

    iOS網(wǎng)絡(luò)開發(fā)(7)大牛們的杰作AFNetworking


  • 請求對象的序列化工具

功能一:完成請求對象的功能

    使用AFHTTPRequestOperationManager發(fā)送請求參數(shù)是NSURL而不是NSURLRequest;之前介紹過,NSURLRequest中并不僅僅是NSURL,還可以:設(shè)置請求頭參數(shù)、設(shè)置緩存策略、設(shè)置請求超時(shí)等

    這些功能由請求對象的序列化工具對象完成


功能二:請求的參數(shù)自動(dòng)序列化

    除了完成這些本屬于NSURLRequest的任務(wù)外,還能實(shí)現(xiàn)將請求的參數(shù)(URL參數(shù)及請求體參數(shù))進(jìn)行序列化,由于很少服務(wù)器上請求要求傳遞JSON/XML數(shù)據(jù),所以這個(gè)功能很少使用


父類:AFHTTPRequestSerializer 

子類:AFJSONRequestSerializer(默認(rèn)) AFPropertyListRequestSerializer  ...


1)設(shè)置請求頭的參數(shù)

- (void)setValue:(nullable NSString *)valueforHTTPHeaderField:(NSString *)field
- (nullable NSString *)valueForHTTPHeaderField:(NSString *)field
@property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders

如:發(fā)送GET請求獲得用戶信息,要求傳入header參數(shù)  Authorization=tokenID xxxxxx

    iOS網(wǎng)絡(luò)開發(fā)(7)大牛們的杰作AFNetworking

2)設(shè)置緩存策略

@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy

3)通過序列化工具,可以設(shè)置請求超時(shí)

@property (nonatomic, assign) NSTimeInterval timeoutInterval


  • 響應(yīng)對象的反序列化工具

功能一:將響應(yīng)數(shù)據(jù)反序列化

    也就是說,如果接受到一個(gè)JSON數(shù)據(jù),它能幫助我們直接反序列化為OC基本數(shù)據(jù)對象


功能二:通過一些屬性的設(shè)定,可以限制接收哪些想要的響應(yīng)數(shù)據(jù)

    

父類:AFHTTPResponseSerializer

子類:AFJSONResponseSerializer AFPropertyListResponseSerializer AFImageResponseSerializer

               AFXMLParserResponseSerializer AFXMLDocumentResponseSerializer

默認(rèn)是AFJSONResponseSerializer,因?yàn)榇蠖鄶?shù)的請求都是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

提供了對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
// 請求執(zhí)行所在任務(wù)隊(duì)列 
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue
// 響應(yīng)對象的序列化工具
@property (nonatomic, strong) id<AFURLResponseSerialization> responseSerializer
...

下載任務(wù)及上傳任務(wù)在后面的文章介紹



  • AFNetworkingActivityIndicatorManager

用于方便地管理狀態(tài)欄上的網(wǎng)絡(luò)活動(dòng)指示器     

獲得全局對象:

+ (instancetype)sharedManager

網(wǎng)絡(luò)活動(dòng)指示器的顯示狀態(tài):

@property (nonatomic, assign, getter=isEnabled) BOOL enabled
@property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible

為了方便正確地控制指示器狀態(tài),在管理對象中包含一個(gè)整型的引用計(jì)數(shù),當(dāng)>0時(shí)顯示,==0時(shí)不顯示

在發(fā)起網(wǎng)絡(luò)請求前,使用下面的方法,對引用計(jì)數(shù)+1:

- (void)incrementActivityCount

在完成網(wǎng)絡(luò)請求后,使用下面的方法,對引用計(jì)數(shù)-1:

- (void)decrementActivityCount


  • AFNetworkReachabilityManager

用于檢測網(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中對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ò)請求任務(wù)對象

     管理著NSURLConnection,并實(shí)現(xiàn)了其代理方法

AFHTTPRequestOperation又是AFURLRequestOperation的子類

     包含請求任務(wù)成功或失敗時(shí)需要執(zhí)行的block(實(shí)際上這些block是在代理方法中被調(diào)用)

AFHTTPRequestOperationManager用于快速創(chuàng)建AFHTTPRequestOperation并添加到任務(wù)隊(duì)列中

AFURLRequestSerialization用于幫助構(gòu)建NSURLRequest

格式化參數(shù):

     一般我們請求都會(huì)按key=value的方式帶上各種參數(shù),GET方法參數(shù)直接加在URL上,POST方法放在body上,NSURLRequest沒有封裝好這個(gè)參數(shù)的解析,只能我們自己拼好字符串。AFNetworking提供了接口,讓參數(shù)可以是NSDictionary, NSArray, NSSet這些類型,再由內(nèi)部解析成字符串后賦給NSURLRequest。

轉(zhuǎn)化過程大致是這樣的:

     


向AI問一下細(xì)節(jié)

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

AI