AFN的使用以及和ASI的區(qū)別

一、2大管理對(duì)象

1.AFHTTPRequestOperationManager

* 對(duì)NSURLConnection的封裝

2.AFHTTPSessionManager

* 對(duì)NSURLSession的封裝

二、AFHTTPRequestOperationManager的具體使用

1.創(chuàng)建管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

2.封裝請(qǐng)求參數(shù)

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"哈哈哈";

params[@"pwd"] = @"123";

3.發(fā)送請(qǐng)求

NSString *url = @"http://localhost:8080/MJServer/login";

[mgr POST:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block

NSLog(@"請(qǐng)求成功---%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block

NSLog(@"請(qǐng)求失敗");

}];

// GET請(qǐng)求

[mgr GET:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block

NSLog(@"請(qǐng)求成功---%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block

NSLog(@"請(qǐng)求失敗");

}];

三、對(duì)服務(wù)器返回?cái)?shù)據(jù)的解析

1.AFN可以自動(dòng)對(duì)服務(wù)器返回的數(shù)據(jù)進(jìn)行解析

* 默認(rèn)將服務(wù)器返回的數(shù)據(jù)當(dāng)做JSON來(lái)解析

2.設(shè)置對(duì)服務(wù)器返回?cái)?shù)據(jù)的解析方式

1> 當(dāng)做是JSON來(lái)解析(默認(rèn)做法)

* mgr.responseSerializer = [AFJSONResponseSerializer serializer];

* responseObject的類型是NSDictionary或者NSArray

2> 當(dāng)做是XML來(lái)解析

* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

* responseObject的類型是NSXMLParser

3> 直接返回data

* 意思是:告訴AFN不要去解析服務(wù)器返回的數(shù)據(jù),保持原來(lái)的data即可

* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

3.注意

* 服務(wù)器返回的數(shù)據(jù)一定要跟responseSerializer對(duì)得上

1> 服務(wù)器返回的是JSON數(shù)據(jù)

* AFJSONResponseSerializer

* AFHTTPResponseSerializer

2> 服務(wù)器返回的是XML數(shù)據(jù)

* AFXMLParserResponseSerializer

* AFHTTPResponseSerializer

3> 服務(wù)器返回的是其他數(shù)據(jù)

* AFHTTPResponseSerializer

四.AFN 的使用 ?

重點(diǎn): 掌握 AFN 發(fā)送網(wǎng)絡(luò)請(qǐng)求的方法.

{

AFN 是最常用的網(wǎng)絡(luò)框架, AFN 內(nèi)部封裝了 NSURLConnection 和 NSURLSession

其中:

AFHTTPRequestOperationManager 是對(duì) NSURLConnection 的封裝;

AFHTTPSessionManager 是對(duì) NSURLSession 的封裝.

AFN 的使用非常簡(jiǎn)單:

總共分為兩步: 1. 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者; 2. 封裝請(qǐng)求參數(shù); 3.發(fā)送請(qǐng)求.

// 1. 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 2. 封裝請(qǐng)求參數(shù)

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"zhangsan";

params[@"password"] = @"zhang";

// 3. 發(fā)送網(wǎng)絡(luò)請(qǐng)求 ,AFN 中最常用的兩個(gè)請(qǐng)求就是 GET 請(qǐng)求 和 POST 請(qǐng)求

{

// GET請(qǐng)求

[mgr GET:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block

NSLog(@"請(qǐng)求成功---%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block

NSLog(@"請(qǐng)求失敗");

}];

// POST請(qǐng)求

[mgr POST:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block

NSLog(@"請(qǐng)求成功---%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block

NSLog(@"請(qǐng)求失敗");

}];

}

}

五. AFN 數(shù)據(jù)解析 ?

重點(diǎn): 針對(duì)不同的網(wǎng)絡(luò)請(qǐng)求,設(shè)置不同的數(shù)據(jù)解析器

{

<1> AFN 可以自動(dòng)對(duì)服務(wù)器返回的數(shù)據(jù)進(jìn)行解析,默認(rèn)將服務(wù)器返回的數(shù)據(jù)當(dāng)做 JSON 數(shù)據(jù)解析.

必須按照服務(wù)器返回的數(shù)據(jù)格式,選擇不同的解析器.不然,就會(huì)報(bào)錯(cuò),得不到想要的數(shù)據(jù).

{

// 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 1. 默認(rèn)情況下,網(wǎng)絡(luò)請(qǐng)求的管理者的解析器如下:

// 由于返回的是 JSON 數(shù)據(jù),所以從服務(wù)器返回的數(shù)據(jù):responseObject 的類型是 NSDictionary 或者 NSArray

mgr.responseSerializer = [AFJSONResponseSerializer serializer];

// 2. 如果服務(wù)器返回的是 XML 數(shù)據(jù),那么必須設(shè)置網(wǎng)絡(luò)請(qǐng)求管理者的解析器類型如下:

// 這時(shí),服務(wù)器返回的數(shù)據(jù) responseObject 的數(shù)據(jù)類型是 NSXMLParser

mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

// 3. 如果服務(wù)器返回的是 data(比如:文件數(shù)據(jù)),這時(shí)需要告訴 AFN 不要去解析服務(wù)器返回的數(shù)據(jù),保持原來(lái)的 data 數(shù)據(jù)就可以了.

mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

}

<2> 需要特別注意的是,服務(wù)器返回的數(shù)據(jù)一定要跟 responseSerializer 相對(duì)應(yīng).對(duì)應(yīng)關(guān)系如下:

{

1> 服務(wù)器返回的是JSON數(shù)據(jù)

* AFJSONResponseSerializer

* AFHTTPResponseSerializer

2> 服務(wù)器返回的是XML數(shù)據(jù)

* AFXMLParserResponseSerializer

* AFHTTPResponseSerializer

3> 服務(wù)器返回的是其他數(shù)據(jù)

* AFHTTPResponseSerializer

}

}

六,AFN和ASI的區(qū)別

一、底層實(shí)現(xiàn)

1> AFN的底層基于OC的NSURLConnection和NSURLSession

2> ASI的底層基于純C語(yǔ)言的CFNetwork框架

3> ASI的運(yùn)行性能 高于 AFN

二、對(duì)服務(wù)器返回的數(shù)據(jù)處理

1> ASI沒(méi)有直接提供對(duì)服務(wù)器數(shù)據(jù)處理的方式,直接返回data\string

2> AFN提供了多種對(duì)服務(wù)器數(shù)據(jù)處理的方式

* JSON處理

* XML處理

* 其他處理

三、監(jiān)聽(tīng)請(qǐng)求的過(guò)程

1> AFN提供了success和failure兩個(gè)block來(lái)監(jiān)聽(tīng)請(qǐng)求的過(guò)程(只能監(jiān)聽(tīng)成功和失?。?/p>

* success : 請(qǐng)求成功后調(diào)用

* failure : 請(qǐng)求失敗后調(diào)用

2> ASI提供了3套方案,每一套方案都能監(jiān)聽(tīng)請(qǐng)求的完整過(guò)程

(監(jiān)聽(tīng)請(qǐng)求開(kāi)始、接收到響應(yīng)頭信息、接受到具體數(shù)據(jù)、接受完畢、請(qǐng)求失敗)

* 成為代理,遵守協(xié)議,實(shí)現(xiàn)協(xié)議中的代理方法

* 成為代理,不遵守協(xié)議,自定義代理方法

* 設(shè)置block

四、在文件下載和文件上傳的使用難易度

1> AFN

* 不容易監(jiān)聽(tīng)下載進(jìn)度和上傳進(jìn)度

* 不容易實(shí)現(xiàn)斷點(diǎn)續(xù)傳

* 一般只用來(lái)下載不大的文件

2> ASI

* 非常容易實(shí)現(xiàn)下載和上傳

* 非常容易監(jiān)聽(tīng)下載進(jìn)度和上傳進(jìn)度

* 非常容易實(shí)現(xiàn)斷點(diǎn)續(xù)傳

* 下載或大或小的文件都行

五、ASI提供了更多的實(shí)用功能

1> 控制圈圈要不要在請(qǐng)求過(guò)程中轉(zhuǎn)

2> 可以輕松地設(shè)置請(qǐng)求之間的依賴:每一個(gè)請(qǐng)求都是一個(gè)NSOperation對(duì)象

3> 可以統(tǒng)一管理所有請(qǐng)求(還專門提供了一個(gè)叫做ASINetworkQueue來(lái)管理所有的請(qǐng)求對(duì)象)

* 暫停\恢復(fù)\取消所有的請(qǐng)求

* 監(jiān)聽(tīng)整個(gè)隊(duì)列中所有請(qǐng)求的下載進(jìn)度和上傳進(jìn)度

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容