AFNetWorking使用(一)

AFNetworking可以說是iOS中最常用的開源框架了,在GitHub中的地址https://github.com/AFNetworking/AFNetworking主要是對NSURLSession進行對封裝操作,其中主要分為了七個類,最常用的就是AFHTTPSessionManager,它繼承自于AFURLSessionManager;

AFNetworking

在日常工作中,我們經常用去使用HTTP請求來獲取、處理數據,常用的請求方式就是Get和Post請求,這個面試的時候也會經常被問到他們至今的區別,我查看的資料基本上都講述以下內容:

從表面上看:

Get以?分割拼接在URL后面,有長度限制,是明文顯示;Post請求參數放在Body里面,一般沒有長度顯示,不是明文顯示,略微安全

從語義(協議的定義規范)上看:

Get是獲取資源的,是安全的(不引起server端的變化)、冪等的(同一請求方法執行一次和執行多次效果相同),可緩存的
Post是處理資源,是不安全的,非冪等的,不可緩存的

講回正題,寫一下調用Get方法的流程
首先,我們要發起請求,主要調用該Get方法

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
                        parameters:(nullable id)parameters
                           headers:(nullable NSDictionary <NSString *, NSString *> *)headers
                          progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
                           success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                           failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

在這個方法中,主要是創建了一個NSURLSessionDataTask任務,來對服務器端端數據進行讀取操作

NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"
                                                    URLString:URLString
                                                   parameters:parameters
                                                      headers:headers
                                               uploadProgress:nil
                                             downloadProgress:downloadProgress
                                                      success:success
                                                      failure:failure];

[dataTask resume];

return dataTask;

隨后就會使用到dataTaskWithHTTPMethod這個方法,在這個方法中,框架會使用到NSMutableURLRequest來設置request屬性參數、設置HTTP的頭部請求字段headerField、對序列化進行一次判斷,失敗則進行異步操作直接返回nil,上述操作無問題則創建NSURLSessionDataTask,傳遞給URLSessionManager做任務請求;在這個方法中,又主要調用了requestWithMethod:、dataTaskWithRequest:這兩個方法

NSError *serializationError = nil;
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
for (NSString *headerField in headers.keyEnumerator) {
    [request setValue:headers[headerField] forHTTPHeaderField:headerField];
}
if (serializationError) {
    if (failure) {
        dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
            failure(nil, serializationError);
        });
    }

    return nil;
}

__block NSURLSessionDataTask *dataTask = nil;
dataTask = [self dataTaskWithRequest:request
                      uploadProgress:uploadProgress
                    downloadProgress:downloadProgress
                   completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {
        if (failure) {
            failure(dataTask, error);
        }
    } else {
        if (success) {
            success(dataTask, responseObject);
        }
    }
}];

return dataTask;

基本上Get請求的調用就是這樣,在這其中,最終的方法就是dataTaskWithHTTPMethod這個方法做了最后的結果返回,在這一系列方法中,我們用到了NSMutableURLRequest進行了URLRequest的請求創建,并設置 request 的 allowsCellularAccess、cachePolicy、HTTPShouldHandleCookies、HTTPShouldUsePipelining、networkServiceType、timeoutInterval等屬性

了解的不深,先寫這么多,等再學習NSURLSession之后再對AFNetworking進行深入描述;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。