iOS網路-05-AFNetwoking原理及常用操作
AFN的六大模組
NSURLConnection,主要對NSURLConnection進行了進一步的封裝,包含以下核心的類:
AFURLConnectionOperation AFHTTPRequestOperationManager AFHTTPRequestOperation NSURLSession,主要對象NSURLSession對象進行了進一步的封裝,包含以下核心的類:
AFURLSessionManager AFHTTPSessionManager Reachability,提供了與網路狀態相關的操作介面,包含以下核心的類:
AFNetworkReachabilityManager Security,提供了與安全性相關的操作介面,包含以下核心的類:
AFSecurityPolicy Serialization,提供了與解析資料相關的操作介面,包含以下核心的類:
AFURLRequestSerialization AFURLResponseSerialization UIKit,提供了大量網路請求過程中與UI介面顯示相關的操作介面,通常用於網路請求過程中提示,使使用者互動更加友好,包含以下核心的分類/類:
AFNetworkActivityIndicatorManager UIActivityIndicatorView+AFNetworking UIAlertView+AFNetworking UIButton+AFNetworking UIImageView+AFNetworking UIKit+AFNetworking UIProgressView+AFNetworking UIRefreshControl+AFNetworking UIWebView+AFNetworkingAFURLSessionManager
建立任務的方法
普通任務
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler/*** request:請求對象* completionHandler:請求完成調用的Block * response:伺服器的響應資訊 * responseObject:伺服器返回的資料 * error:錯誤資訊*/
上傳任務(
分別上傳不同類型的檔案
)
// 1. 上傳檔案類型的資料- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler/*** fileURL:所要上傳檔案的路徑*/// 2. 上傳NSData類型的資料- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler/*** bodyData:所要上傳的檔案資料*/// 3. 上傳流資料- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler/*** request:通過流資料初始化的請求對象*/
下載任務
// 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:儲存資料調用的Block * targetPath:資料的儲存路徑 * 伺服器的響應資訊*/// 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 *),用於監視網路可達性與建立請求對象 requestSerializer(AFHTTPRequestSerializer *),指定指定GET、HEAD與DELETE請求參數的解析格式 responseSerializer(AFHTTPResponseSerializer *),用於指定伺服器返回資料的格式
常用方法
初始化
// 1. 通過Factory 方法建立AFHTTPSessionManager對象+ (instancetype)manager// 2. 通過構造方法建立AFHTTPSessionManager對象- (instancetype)initWithBaseURL:(NSURL *)url/*** 根據url初始化AFHTTPSessionManager對象*/- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration/*** 根據url與configuration初始化AFHTTPSessionManager對象*/
請求資料
// 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:請求參數* success:請求成功時調用的Block * responseObject:伺服器返回的資料* failure:請求失敗時調用的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/*** 參數含義與GET請求相同*/- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id formData))block success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure/*** block:用於建立多個資料來源*/
使用AFN請求網路資料
請求資料(XML/JSON)
建立AFHTTPSessionManager對象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
指定對伺服器的返回資料格式
//以XML文檔的形式返回資料manager.responseSerializer = [AFXMLParserResponseSerializer serializer];//以JSON形式返回資料manager.responseSerializer = [AFJSONResponseSerializer serializer];
佈建要求體(
類型為XML或JSON
)
// 請求體通常由伺服器指定格式 NSDictionary *params = @{ @username : @帳號, @pwd : @密碼, @type : @XML/JSON };
發送請求
[manager GET:@請求路徑 parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { //responseObject:伺服器返回的資料 NSLog(@請求成功);} failure:^(NSURLSessionDataTask *task, NSError *error) { //error:錯誤資訊 NSLog(@請求失敗);}];
上傳資料
建立AFHTTPSessionManager對象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
建立上傳任務
/**基於NSURLConnection*/[manager POST:@請求路徑 parameters:@{@使用者名稱 : @密碼 constructingBodyWithBlock:^(id formData) { //設定需要上傳的檔案 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) { //上傳資料成功}];
下載資料
建立AFHTTPSessionManager對象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
建立下載任務
/**基於NSURLSession*/[manager downloadTaskWithRequest:request progress:progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 儲存下載資料是調用的Block} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { //下載完成時調用的Block}]
。