AFN 1 AFN 的概念原理 AFN 的基礎是 NSURL,AFN 的直接操作對象 AFHTTPClient是一個實現了 NSCoding 和 NSCopying協議的NSObject 的子類. AFHTTPClient是一個封裝了一系列操作方法的工具類,處理請求的操作類一系列單獨的,基於 NSO ...
AFN
1 AFN 的概念原理
AFN 的基礎是 NSURL,AFN 的直接操作對象 AFHTTPClient是一個實現了 NSCoding 和 NSCopying協議的NSObject 的子類. AFHTTPClient是一個封裝了一系列操作方法的工具類,處理請求的操作類一系列單獨的,基於 NSOperation 封裝的, AFURLConnectionOperation的子類.AFN 的 demo 中通過靜態方法,使用 dispatic_once()方法創建 AFHTTPClient 共用實例.在創建 AFHTTPClient 中,創建了 operatioQueue並設置了一系列預設的參數值.在 getPath—parameters—successs—failure 方法中創建了 NSURLRequest, 並根據該請求創建了 NSOpreation,並加入在初始化方法中的 NSOprarationQueue 中.(註:以上操作都在主隊列中完成)
需要說明的是, AFN2.0是對 NSURLConnection , NSURLSession,HTTPS網路安全請求以及網路連接管理的封裝,但是到 AFN3.0的時候添加了回調並刪除了 NSURLConnection 的封裝,這是因為NSURLSession 可以完全代替 NSURLConnection 方法,並且具有以下特點:
- 支持後臺運行的網路任務
- 暫停、停止、重啟網路任務,不需要自己封裝NSOperation
- 支持斷點續傳,非同步下載
- 支持上傳,非同步上傳
- 獲取下載、上傳的進度
2 AFN 的使用
2.1 AFN 的直接使用
> 實例化網路請求管理類
- AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
- > 選擇請求方法發送請求
NSString *urlString = @"http://127.0.0.1/resources/vedios.xml";//url
[manager GET:urlString parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
// 這裡可以獲得請求的進度信息
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 成功的回調,這裡就得到了數據,JSON數據會自動解析
// 如果是XML,HTML或者其它數據,需要選擇不同的解析器
} } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 失敗的回調
}];
2.2 AFN 的封裝
由於 AFN 只是一個框架,為避免由於 AFN 出現一個重大的 BUG 或者其他的原因,而造成的重大損失,我們一般講 AFN 和網路請求分離開.
實現步驟
> 創建一個類繼承自 AFN(假如在使用中只用到HTTP 那我們可以讓這個類繼承自AFHTTTPSessionManager)
> 在這個類中提供一個類方法,用於創建這個類的對象(可以用單例實現)
> 創建一個對象方法,用於進行網路請求,提供參數,可以進行 POST GET HEAD等
2.3 AFN 與其他框架
> AFN 框架是一款簡單易用的框架,有人維護,使用量大
> ASIHTTPRequst :ASI 的底層是基於純 C 語言的 CFNetworking, 功能非常的強大,但是已經停止更新
> MKNetWork: 簡單易用,但使用者少.
三者的對比
2.4 AFN 和 ASI 的對比
ASI 簡介
ASI的直接操作對象是ASIHTTPRequest,是一個實現了NSCopying協議的NSOperation子類,在initialize和initWithURL:方法中初始化相關屬性並設置一系列請求相關參數預設值.此外,ASIHTTPRequest還提供了一系列的實例方法用來配置請求對象.
1> 底層實現
- Ø AFN是基於 OC 的 NSURLConnection 和 NSURLSession
- Ø ASI 是基於 C的 CFNetWork 框架
- Ø ASI 的執行性能高於 AFN
2>對伺服器返回數據的處理
- Ø ASI 沒有提供腿伺服器返回數據的處理,返回的直接是 data/string
- Ø AFN 提供了多種處理數據的方式, JSON(預設),XML和其他數據處理
3>監聽過程
- Ø AFN 監聽請求結果 successs(成功block回調)和 failure(失敗block回調).
- Ø ASI 提供了三套方案,可以監聽整個請求過程(包括:開始,進程,結果:成功和失敗)
成為代理à遵守協議à實現協議中的方法
成為代理à不遵守協議à自定義協議方法
設置 block
4> 下載和上傳中的使用
- Ø AFN 下載小文件和上傳單文件,不能用於監聽(上傳和下載),也不能斷點續傳.
- Ø ASI 可以用來監聽上傳和下載,可以斷點續傳,可以下載比較大的文件.
5>ASI 是其他優點
- Ø 控制圈圈要不要在下載過程中轉圈
- Ø 可以輕鬆設置請求之間的依賴(每個請求都是一個NSOperation對象)
- Ø 可以統一管理所有的請求(用ASINetWorkQueue)
- Ø 可以暫停/取消/恢復請求
- Ø 監聽隊列中所有請求的進度
- Ø AFN 和 ASI 對比圖
- Ø http://wenku.baidu.com/link?url=PAzbEWzLxF9U499tWk9h_9ekrAr27O3_OeyGYaBUL4K6EbHn3VMYahbEkoIwzXxC3mWfvhCROQmW8uyiXJhWAcct6Y9KATNPHACZfDPt2US
3 總結
3.1 用法
- Ø AFNetworkReachabilityManager:實時監測網路狀態(只要網路狀態改變都可以監測到)
- Ø AFSecurityPolicy:安全策略,支持 HTTPS 請求
- Ø AFN 是用來發送網路請求
3.2 AFN 返回數據解析方法
> JSON à JSON 解析器:
manager.responseSerializer = [AFJSONResponseSerializer serializer];
> XML à XML 解析器 NSXMLParser (預設是 SAX 解析)
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
> 萬能解析器 NSData 解析為二進位數據
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
3.3 AFN 成功回調的要求
1.網路請求成功 2.伺服器返回的必須是JSON數據 3.AFN能夠解析JSON數據
3.4 常用的方法
> 改變解析器類型
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
> 增加解析器解析文件類型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript" ,@"text/plain",nil];
3.5 實時監測網路狀態
AFNetworkReachabilityManager 只要網路狀態改變,都可以監測到!
下麵是提供的實例:
1. 實例化網路工具監測類.
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
2. 設置網路狀態改變之後的操作.
ReachabilityStatusChangeBlock:一旦網路狀態改變之後,就會執行下麵的 block.
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知的網路...");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"沒有網路...");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窩移動網路...");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI網路...");
break;
default:
break;
}
}];
3開啟網路監測.
[manager startMonitoring];
3.6 iOS中發送網路請求的方式
> 蘋果原生: NSURLConnection, NSURLSession:iOS7, CFNetWork:(純C一般不用)
> 第三方: AFNetWorking, ASIHttpRequest, MKNetWorkKit.