iOS--AFN實現原理

AFN的六大模塊


1,NSURLConnection

主要對NSURLConnection進行了進一步的封裝,包含以下核心的類:

AFURLConnectionOperation

AFHTTPRequestOperationManager

AFHTTPRequestOperation


2,NSURLsession

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

AFURLSessionManager

AFHTTPSessionManager


3,Reachability

提供了與網絡狀態相關的操作接口,包含以下核心的類:

AFNetworkReachabilityManager


4,Security

提供了與安全性相關的操作接口,包含以下核心的類:

AFSecurityPolicy


5,Serialization

提供了與解析數據相關的操作接口,包含以下核心的類:

AFURLRequestSerialization

AFURLResponseSerialization


6,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. 上傳文件類型的數據

      /**

       * fileURL:所要上傳文件的路徑

       */


      - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler


      // 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 *),指定指定GETHEADDELETE請求參數的解析格式

      responseSerializer(AFHTTPResponseSerializer *),用於指定服務器返回數據的格式

      常用方法

      初始化

      // 1. 通過工廠方法創建AFHTTPSessionManager對象

      + (instancetype)manager

      // 2. 通過構造方法創建AFHTTPSessionManager對象

      - (instancetype)initWithBaseURL:(NSURL *)url

      /**

       * 根據url初始化AFHTTPSessionManager對象

       */

      - (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration

      /**

       * 根據urlconfiguration初始化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];

      設置請求體(類型爲XMLJSON)

      // 請求體通常由服務器指定格式

      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

      }];

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章