AFNetWorking的原理及常用操作

一.簡介

AFNetworking是一個輕量級的iOS網(wǎng)絡通信類庫,它建立在NSURLConnection和NSOperation等類庫的基礎(chǔ)上。AFNetworking可用于發(fā)送HTTP請求(包括GET、POST、 PUT、DELETE等),接收HTTP的響應,但是不會緩存服務器的響應,不能執(zhí)行HTML頁面中的JAvascript代碼,同時,AFNetworking還內(nèi)置支持JSON,plist文件和XML文件的解析,使用比較方便。

二.AFN的六大模塊

1.主要對NSURLConnection進行了進一步的封裝(iOS9-NSURLConnection已經(jīng)不能使用),包含以下核心的類:

AFURLConnectionOperation
AFHTTPRequestOperationManager
AFHTTPRequestOperation

2.要對象NSURLSession對象進行了進一步的封裝,包含以下核心的類:

AFURLSessionManager
AFHTTPSessionManager

3.Reachability,提供了與網(wǎng)絡狀態(tài)相關(guān)的操作接口,包含以下核心的類:

AFNetworkReachabilityManager

4.Security,提供了與安全性相關(guān)的操作接口,包含以下核心的類:

AFSecurityPolicy

5.Serialization,提供了與解析數(shù)據(jù)相關(guān)的操作接口,包含以下核心的類:

AFURLRequestSerialization
AFURLResponseSerialization

6.UIKit,提供了大量網(wǎng)絡請求過程中與UI界面顯示相關(guān)的操作接口,通常用于網(wǎng)絡請求過程中提示,使用戶交互更加友好,包含以下核心的分類/類:

AFNetworkActivityIndicatorManager
UIActivityIndicatorView+AFNetworking
UIAlertView+AFNetworking
UIButton+AFNetworking
UIImageView+AFNetworking
UIKit+AFNetworking
UiprogressView+AFNetworking
UIRefreshControl+AFNetworking
UIWebView+AFNetworking
三.常用的核心類的介紹
AFURLSessionManager

創(chuàng)建任務的方法:
普通任務

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *response, id responSEObject, NSError *error))completionHandler
/**
* request:請求對象
* completionHandler:請求完成調(diào)用的Block 
    * response:服務器的響應信息
    * responseObject:服務器返回的數(shù)據(jù)
    * error:錯誤信息
*/

上傳任務(分別上傳不同類型的文件)

// 1. 上傳文件類型的數(shù)據(jù)
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
/**
* fileURL:所要上傳文件的路徑
*/

// 2. 上傳NSData類型的數(shù)據(jù)
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
/**
* bodyData:所要上傳的文件數(shù)據(jù)
*/

// 3. 上傳流數(shù)據(jù)
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
/**
* request:通過流數(shù)據(jù)初始化的請求對象
*/

下載任務

// 1. 普通下載任務
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
/**
* progress:管理下載進度
* destination:保存數(shù)據(jù)調(diào)用的Block
    * targetPath:數(shù)據(jù)的保存路徑
    * 服務器的響應信息
*/

// 2. 支持斷點下載的下載任務
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData progress:(NSProgress * __autoreleasing *)progress destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler 
/**
* progress:管理下載進度
* resumeData:斷點下載時的斷點信息
*/        
AFHTTPSessionManager

常用的屬性:

baseURL(NSURL *),用于監(jiān)視網(wǎng)絡可達性與創(chuàng)建請求對象
requestSerializer(AFHTTPRequestSerializer *),指定指定GET、HEAD與DELETE請求參數(shù)的解析格式
responseSerializer(AFHTTPResponseSerializer *),用于指定服務器返回數(shù)據(jù)的格式

常用方法:

初始化

// 1. 通過工廠方法創(chuàng)建AFHTTPSessionManager對象
+ (instancetype)manager
// 2. 通過構(gòu)造方法創(chuàng)建AFHTTPSessionManager對象
- (instancetype)initWithBaseURL:(NSURL *)url
/**
* 根據(jù)url初始化AFHTTPSessionManager對象
*/
- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration
/**
* 根據(jù)url與configuration初始化AFHTTPSessionManager對象
*/
請求數(shù)據(jù)

// 1. GET請求
- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
/**
* URLString:請求路徑
* parameters:請求參數(shù)
* success:請求成功時調(diào)用的Block
    * responseObject:服務器返回的數(shù)據(jù)
* failure:請求失敗時調(diào)用的Block
    * error:錯誤信息
*/
// 2. POST請求
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
/**
* 參數(shù)含義與GET請求相同
*/
- (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
/**
* block:用于創(chuàng)建多個數(shù)據(jù)來源
*/
使用AFN請求網(wǎng)絡數(shù)據(jù)

請求數(shù)據(jù)(xml/JSON)

創(chuàng)建AFHTTPSessionManager對象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
指定對服務器的返回數(shù)據(jù)格式

//以XML文檔的形式返回數(shù)據(jù)
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//以JSON形式返回數(shù)據(jù)
manager.responseSerializer = [AFJSONResponseSerializer serializer];
設(shè)置請求體(類型為XML或JSON)

// 請求體通常由服務器指定格式
    NSDictionary *params = @{
                         @"username" : @"賬號",
                         @"pwd" : @"密碼",
                         @"type" : @"XML/JSON"
                         };                             
發(fā)送請求

[manager GET:@"請求路徑" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
    //responseObject:服務器返回的數(shù)據(jù)
    NSLog(@"請求成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    //error:錯誤信息
    NSLog(@"請求失敗");
}];

上傳數(shù)據(jù)

創(chuàng)建AFHTTPSessionManager對象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
創(chuàng)建上傳任務

/**基于NSURLConnection*/
[manager POST:@"請求路徑" parameters:@{@"用戶名" : @"密碼" constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    //設(shè)置需要上傳的文件
    NSData *data = [NSData dataWithContentsOfFile:@"所要長傳文件的路徑"];
    [formData appendPartWithFileData:data name:@"file" fileName:@"test.png" mimeType:@"image/png"];
} success:^(NSURLSessionDataTask *task, id responseObject) {      
    //上傳成功
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    //上傳失敗
}];

/**基于NSURLSession*/
[manager uploadTaskWithRequest:request fromData:data progress:progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    //上傳數(shù)據(jù)成功
}];

下載數(shù)據(jù)

創(chuàng)建AFHTTPSessionManager對象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
創(chuàng)建下載任務

/**基于NSURLSession*/
[manager downloadTaskWithRequest:request progress:progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    // 存儲下載數(shù)據(jù)是調(diào)用的Block
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    //下載完成時調(diào)用的Block
}]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 13.服務器圖片改了,url沒有變,需求,服務器的圖片變了,就從服務器加載圖片,如果服務器的沒變,就從本地加載 1...
    AlanGe閱讀 1,456評論 0 1
  • AFN 2.x 的六大模塊: NSURLConnection 主要對NSURLConnection進行了進一步的封...
    CoderLocus閱讀 6,843評論 2 26
  • 首先祝中國足球隊勝利,雖然我不看足球。 在正式開始之前,給大家看一段話:這也是前段時間朋友圈有人發(fā)的。 -----...
    聯(lián)絡兵閱讀 332評論 0 0
  • 親愛的晉善: 一次,爸爸下班回來,匆匆地走進房間,然后抱起你,開始在房間里走來走去,豆丁媽媽嗎就問我,在學校里的時...
    丁爸閱讀 637評論 0 50
  • 昨天已經(jīng)到工作的地方了,感覺心情很郁悶真不想離開家,在離開家前爸媽已經(jīng)給我做好了準備早早就為我做起了飯。我爸...
    小草_379e閱讀 174評論 0 1

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