一般情況下主動(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];
}
下面是類別方法

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

//類別方法取消請求


操作runtime 用了開源
import"Aspects.h"
這只是思路 字典的存取沒做線程安全控制 可以改進(jìn)很多地方
如果不是每一個(gè)VC都有這種需求,可以通過維護(hù)特定的VC列表來 避免所有的VC做判斷。
現(xiàn)在看來我們每個(gè)VC 沒有做額外的工作 只是添加刪除隊(duì)列 就可以完成界面消失的時(shí)候自動(dòng)取消請求的需求。