基于AFNetworking 3.0的取消已發(fā)出的網(wǎng)絡(luò)請求

一般情況下主動(dòng)取消請求的需求不會(huì)太多

除非以下幾種情況

1.比如電商應(yīng)用為例 請求頻繁,數(shù)據(jù)量大

2.對性能的要求比較高

3.網(wǎng)絡(luò)環(huán)境比較差

當(dāng)一個(gè)用戶打開一個(gè)界面 看到的卻是漫長的等待框 這時(shí)候用戶很可能退出當(dāng)前界面 瀏覽其他界面。再以上幾種情況下 我們有必要做網(wǎng)絡(luò)資源的控制。當(dāng)一個(gè)請求發(fā)送以后,沒必要等他的結(jié)果的時(shí)候我們就應(yīng)該主動(dòng)取消請求。

主動(dòng)取消請求不僅節(jié)省了網(wǎng)絡(luò)資源 ,還可以避免block引用VC導(dǎo)致的延遲內(nèi)存釋放問題?,F(xiàn)在很多網(wǎng)絡(luò)框架都支持這種操作,只要你拿到請求隊(duì)列隨時(shí)可以發(fā)起/取消請求。為了操作隊(duì)列我們會(huì)VC里持有隊(duì)列,設(shè)計(jì)角度上每個(gè)需要請求的VC都持有若干個(gè)隊(duì)列,而且手動(dòng)的取消請求 顯得特別麻煩。

我這邊設(shè)計(jì)的主要思路是:

通過類別來動(dòng)態(tài)管理請求隊(duì)列,避免VC直接持有請求隊(duì)列。

通過runtime來自動(dòng)觸發(fā)取消請求操作。

下面是代碼

AFHTTPSessionManager *session = [AFHTTPSessionManager manager];

for(int i =0 ;  i < 10 ; i++) {
    NSURLSessionDataTask *dataTask = [session GET:@"https://api.github.com/users/facebook" parameters:@[] progress:^(NSProgress * _Nonnull downloadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [self removeTask:task];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         [self removeTask:task];
    }];
    [self addTask:dataTask];
}

下面是類別方法

Paste_Image.png

下面來看下 取消請求的代碼段

我這邊是用runtime 再一個(gè)VC消失的時(shí)候觸發(fā)了取消請求操作

Paste_Image.png

//類別方法取消請求

Paste_Image.png
Paste_Image.png

操作runtime 用了開源

import"Aspects.h"

這只是思路 字典的存取沒做線程安全控制 可以改進(jìn)很多地方

如果不是每一個(gè)VC都有這種需求,可以通過維護(hù)特定的VC列表來 避免所有的VC做判斷。

現(xiàn)在看來我們每個(gè)VC 沒有做額外的工作 只是添加刪除隊(duì)列 就可以完成界面消失的時(shí)候自動(dòng)取消請求的需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容