- 全稱是AFNetworking
- 雖然運(yùn)行效率沒有ASI高,但是使用比ASI簡單
- 是對NSURLConnection和NSURLSession的各自的一層包裝
AFN的內(nèi)部中的RunLoop
- AFN內(nèi)部開了一條專門用來訪問網(wǎng)絡(luò)請求的線程
- 在這個(gè)開線程的方法中,他把方法和
dispatch_once都用static修飾了下 - 以保證這個(gè)方法的安全性以及只開辟一塊內(nèi)存空間,而且保證他線程不死
- 在這個(gè)方法中他會調(diào)用另一個(gè)
網(wǎng)絡(luò)請求入口的方法
- 在這個(gè)入口方法中他會創(chuàng)建一個(gè)RunLoop
- 然后添加一個(gè)
NSMachPort端口,目的是為了讓他里面有Source(因?yàn)橛辛薙ource的RunLoop才能真正跑起來) - 然后啟動(dòng)RunLoop,通過RunLoop在里面不斷的循環(huán),不斷的發(fā)送消息,讓他做事情.

1 - 基于NSURLConnection包裝的重要對象(iOS9-NSURLConnection已經(jīng)不能使用)
AFHTTPRequestOperationManager
- 封裝了HTTP請求的常見處理
- GET\POST請求
- 解析服務(wù)器的響應(yīng)數(shù)據(jù)
// 創(chuàng)建
// AFHTTPRequestOperationManager內(nèi)部包裝了NSURLConnection
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

Snip20150926_5.png
1 - 1 AFHTTPRequestOperationManager的GET請求

Snip20150926_8.png
- 參數(shù)是不用拼接的,AFN內(nèi)部會幫你遍歷字典然后幫你拼接完成,只需把參數(shù)傳入即可.
- 請求成功會來到第一個(gè)block,
id responseObject這個(gè)參數(shù),會自動(dòng)幫你從服務(wù)器得到的JSON數(shù)據(jù)轉(zhuǎn)為字典或者數(shù)組(用id就是因?yàn)椴灰欢ǚ祷氐氖鞘裁磾?shù)據(jù).所以要用到id);他的內(nèi)部無非也就是一個(gè)Request對象 -
NSError *error返回的是錯(cuò)誤信息
1 - 2 AFHTTPRequestOperationManager的POST請求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

Snip20150926_9.png
- POST請求和GET沒什么兩樣,無非就是把GET改為POST即可
2 - 基于NSURLSession包裝的重要對象.
AFHTTPSessionManager
- 封裝了HTTP請求的常見處理
- GET\POST請求
- 解析服務(wù)器的響應(yīng)數(shù)據(jù)
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

Snip20150926_5.png
2 - 1AFHTTPSessionManager的GET請求
- (NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

Snip20150926_15.png
2 - 2 AFHTTPSessionManager的POST請求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

Snip20150926_16.png
AFN解析相關(guān)
- AFN在解析時(shí)候: 默認(rèn)解析的是JSON數(shù)據(jù).
-
我們通過他的一個(gè)內(nèi)部方法可以看到
Snip20150926_22.png -
進(jìn)入頭文件后可以看到他的默認(rèn)處理器為JSON處理器
Snip20150926_24.png - 這樣的話,也就意味著,服務(wù)器返回的任何數(shù)據(jù)AFN內(nèi)部都會當(dāng)做JSON來處理
那么有時(shí)候服務(wù)器返回的是XML數(shù)據(jù)該怎么辦呢
-
如果想解析XML數(shù)據(jù),就需要手動(dòng)把
responseSerializer的值改掉,就可以了
Snip20150926_30.png -
也就意味著這里的
id responseObject,這里需要換做NSXMLParser *parser
Snip20150926_31.png

Snip20150926_32.png
那么有時(shí)候服務(wù)器返回的不是JSON也不是XML怎么辦呢
(比如文件的下載)

Snip20150926_33.png
-
這時(shí),就要告訴AFN用最平常的數(shù)據(jù)來解析,服務(wù)器返回的是什么樣,就解析成什么樣即可
Snip20150926_34.png
服務(wù)器返回的數(shù)據(jù)解析的幾種方式
// 解析服務(wù)器返回的普通數(shù)據(jù)(直接使用 *服務(wù)器本來返回的數(shù)據(jù)* 不作任何解析)
mgr.responseSerializer = [AFJSONResponseSerializer serializer];
// 解析服務(wù)器返回的XML數(shù)據(jù)
mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 解析服務(wù)器返回的JSON數(shù)據(jù) (默認(rèn)解析的是JSON可以不傳)
mgr.responseSerializer = [AFJSONRequestSerializer serializer];
項(xiàng)目中的細(xì)節(jié)處理
有時(shí)候,可能當(dāng)用戶在點(diǎn)擊一個(gè)控制器的button在請求數(shù)據(jù)時(shí)候,會遇到網(wǎng)速慢,返回的數(shù)據(jù)特別慢,用戶可能會等的不耐煩,然后退掉當(dāng)前的控制器,但是這個(gè)請求是還存在著的,一旦請求返回,項(xiàng)目一定會崩潰.那么這種情況該怎么處理呢?
- 遇到這樣的情況,可以先把
AFNHTTPSessionManger做一個(gè)屬性
@property(nonatomic, strong)AFNHTTPSessionManger *manger
- 將所有的發(fā)請求的地方都用成
// 如果這樣使用AFN,會把所有的請求都放入`manger.operationQueue`
self.manger POST/ GET
- 在
- (void)dealloc方法中調(diào)用
// 取消所有任務(wù)
self.manger.operationQueue cancelAllOperations





