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+AFNetworking

AFURLSessionManager


  • 創建任務的方法
    • 普通任務

      - (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. 通過工廠方法創建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 <AFMultipartFormData> 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<AFMultipartFormData> 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
      }]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章