AFN和ASI區別

AFN和ASI區別 

1、AFN和ASI的區別

1.底層實現
1> AFN的底層基於OC的NSURLConnection和NSURLSession
2> ASI的底層基於純C語言的CFNetwork框架
3> ASI的運行性能 高於 AFN

2.對服務器返回的數據處理
1> ASI沒有直接提供對服務器數據處理的方式,直接返回data\string
2> AFN提供了多種對服務器數據處理的方式
* JSON處理
* XML處理
* 其餘處理

3.監聽請求的過程
1> AFN提供了success和failure兩個block來監聽請求的過程(只能監聽成功和失敗)
* success : 請求成功後調用
* failure : 請求失敗後調用

2> ASI提供了3套方案,每一套方案都能監聽請求的完整過程
(監聽請求開始、接收到響應頭信息、接受到具體數據、接受完畢、請求失敗)
* 成爲代理,遵照協議,實現協議中的代理方法
* 成爲代理,不遵照協議,自定義代理方法
* 設置block

4.在文件下載和文件上傳的使用難易度
1> AFN
* 不容易監聽下載進度和上傳進度
* 不容易實現斷點續傳
* 通常只用來下載不大的文件

2> ASI
* 很是容易實現下載和上傳
* 很是容易監聽下載進度和上傳進度
* 很是容易實現斷點續傳
* 下載或大或小的文件都行

5.ASI提供了更多的實用功能
1> 控制圈圈要不要在請求過程當中轉     
2> 能夠輕鬆地設置請求之間的依賴:每個請求都是一個NSOperation對象
3> 能夠統一管理全部請求(還專門提供了一個叫作ASINetworkQueue來管理全部的請求對象)
* 暫停\恢復\取消全部的請求
* 監聽整個隊列中全部請求的下載進度和上傳進度
AFN和ASI的對比的參照圖
http://wenku.baidu.com/link?url=PAzbEWzLxF9U499tWk9h_9ekrAr27O3_OeyGYaBUL4K6EbHn3VMYahbEkoIwzXxC3mWfvhCROQmW8uyiXJhWAcct6Y9KATNPHACZfDPt2US

二.AFN介紹

1. AFHTTPRequestOperationManager是對NSURLConnection的封裝,在iOS6已通過時!
如下是AFN內部的原話,因此AFHTTPRequestOperationManager已通過時了,如今大多用AFHTTPSessionManager
/*
For developers targeting iOS 6 or Mac OS X 10.8 or earlier,AFHTTPRequestOperationManager` may be used to similar effect.
要開發 iOS 6 或 Mac OS X 10.8 以前版本,建議使用
*/

2.AFHTTPSessionManager對NSURLSession的封裝

3.AFN2.0和3.0的比較
AFN2.0
.對NSURLSession的封裝,
.對AFURLConnection的封裝,
.對HTTPS網絡安全請求作了一個包裝,
.作了一個網絡鏈接管理的一個包裝,
AFN3.0
添加進度回調
去掉全部AFURLConnection
4.AFN功能簡介
AFN 主要用來發送網絡請求
AFNetworkReachabilityManager :用來實時監測當前網絡狀態的!
AFSecurityPolicy :安全策略:支持 HTTPS 請求.
如何在AFN中使用HTTPS的請求參照如下資料
http://blog.csdn.net/doubleuto/article/details/42154109

5.AFN發送網絡請求時的注意點
.默認的使用JSON解析器解析JSON數據,返回的默認就是 JSON 解析以後的數據!
.網絡請求成功後默認回到主線程
.插入數據的格式
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript" ,@"text/plain",nil];
.發送網絡請求裏面的參數說明
// parameters :參數字典
// progress :進度. AFN 3.0 以後推出的. 沒有任何用處!
// success :成功回調.{成功的要求: 1.網絡請求成功; 2.服務器返回的必須是 JSON 數據; 3.本身(AFN)還可以解析 JSON數據}

6.AFN中解析器的類型,返回的數據類型,所能解析的數據
要根據服務器返回的數據類型,選擇合適的解析器類型!
// 1. JSON 解析器: JSON 解析以後的數據. ------ JSON
manager.responseSerializer = [AFJSONResponseSerializer serializer];

// 2. XML 解析器: NSXMLParser ------ XML/默認是 SAX 解析.
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 3. 萬能解析器: NSData 數據. ----- JSON /XML /HTML /各類文件...
// 對於文件/圖片/視頻/網頁HTML,只能選擇 萬能解析器!
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

7.利用AFN檢測網絡狀態的步驟
. 實例化網絡工具監測類.
. 設置網絡狀態改變以後的操做.
.開啓網絡監測

三.AFN對文件的上傳和下載

1.文件上傳的注意事項
AFN 只支持單文件上傳!默認將後臺傳回的JSON數據解析成OC的數據類型.

步驟:
.拼接本地文件的路徑,以file://,注意若是路徑中有漢字要用如下方法轉義
stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]
.發送file請求(同步)得到文件的類型名字(url:統一資源定位符. http:// 網絡資源 file://本地資源)
.AFN發送post請求上傳文件
/*
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
*/
.constructingBodyWithBlock內封裝form表單
// name: 服務器接收文件參數的 key 值.
// fileName: 上傳文件在服務器中保存的名稱.
// mimeType: 上傳文件的文件類型.
[form appendPartWithFileURL:url name:@"userfile" fileName:@"w" mimeType:response.MIMEType error:NULL];
注意:經過form表單追加文件是不能實現多文件上傳的

2.AFN實現文件的下載
 
// 執行下載文件的方法,能夠監控下載進度
- (void)downLoadMonitor
{
// 聲明一個進度對象
NSProgress *progress = nil;
// 1.建立網絡管理者
// AFHTTPSessionManager 基於NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 2.利用網絡管理者下載數據
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost.video.zip"]];
/*
destination
- targetPath: 系統給咱們自動寫入的文件路徑
- block的返回值, 要求返回一個URL, 返回的這個URL就是剪切的位置的路徑
completionHandler
- url :destination返回的URL == block的返回的路徑
*/
/*
@property int64_t totalUnitCount; 須要下載文件的總大小
@property int64_t completedUnitCount; 當前已經下載的大小
*/


NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
// NSLog(path);
return [NSURL fileURLWithPath:path];

} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"%@",filePath.absoluteString);

}];

/*
要跟蹤進度,須要使用 NSProgress,是在 iOS 7.0 推出的,專門用來跟蹤進度的類!
NSProgress只是一個對象!如何跟蹤進度!-> KVO 對屬性變化的監聽!
@property int64_t totalUnitCount; 總單位數
@property int64_t completedUnitCount; 完成單位數
*/
// 給Progress添加監聽 KVO
// [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

// 3.啓動任務
[downTask resume];

}
 

下面是使用KVO監聽下載進度
// 執行下載文件的方法,能夠監控下載進度
- (void)downLoadMonitor
{
// 聲明一個進度對象
NSProgress *progress = nil;
// 1.建立網絡管理者
// AFHTTPSessionManager 基於NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 2.利用網絡管理者下載數據
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost.video.zip"]];
/*
destination
- targetPath: 系統給咱們自動寫入的文件路徑
- block的返回值, 要求返回一個URL, 返回的這個URL就是剪切的位置的路徑
completionHandler
- url :destination返回的URL == block的返回的路徑
*/
/*
@property int64_t totalUnitCount; 須要下載文件的總大小
@property int64_t completedUnitCount; 當前已經下載的大小
*/
NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
     NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
     NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
     // NSLog(path);
     return [NSURL fileURLWithPath:path];

} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
      NSLog(@"%@",filePath.absoluteString);
}];

/*
要跟蹤進度,須要使用 NSProgress,是在 iOS 7.0 推出的,專門用來跟蹤進度的類!
NSProgress只是一個對象!如何跟蹤進度!-> KVO 對屬性變化的監聽!
@property int64_t totalUnitCount; 總單位數
@property int64_t completedUnitCount; 完成單位數
*/
// 給Progress添加監聽 KVO
// [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

// 3.啓動任務
[downTask resume];
}
 
轉自:http://www.cnblogs.com/devChang/p/5590074.html
ASI的使用參照文頂頂: http://www.cnblogs.com/wendingding/p/3950027.html 
相關文章
相關標籤/搜索