一.簡介
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
}]