一般情況下主動取消請求的需求不會太多
除非以下幾種情況
1.比如電商應用為例 請求頻繁,數據量大
2.對性能的要求比較高
3.網絡環境比較差
當一個用戶打開一個界面 看到的卻是漫長的等待框 這時候用戶很可能退出當前界面 瀏覽其他界面。再以上幾種情況下 我們有必要做網絡資源的控制。當一個請求發送以后,沒必要等他的結果的時候我們就應該主動取消請求。
主動取消請求不僅節省了網絡資源 ,還可以避免block引用VC導致的延遲內存釋放問題。現在很多網絡框架都支持這種操作,只要你拿到請求隊列隨時可以發起/取消請求。為了操作隊列我們會VC里持有隊列,設計角度上每個需要請求的VC都持有若干個隊列,而且手動的取消請求 顯得特別麻煩。
我這邊設計的主要思路是:
通過類別來動態管理請求隊列,避免VC直接持有請求隊列。
通過runtime來自動觸發取消請求操作。
下面是代碼
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 再一個VC消失的時候觸發了取消請求操作

//類別方法取消請求


操作runtime 用了開源
import"Aspects.h"
這只是思路 字典的存取沒做線程安全控制 可以改進很多地方
如果不是每一個VC都有這種需求,可以通過維護特定的VC列表來 避免所有的VC做判斷。
現在看來我們每個VC 沒有做額外的工作 只是添加刪除隊列 就可以完成界面消失的時候自動取消請求的需求。
==============推廣=================
我有故事你有酒嗎?
我有酒 ,而且只有酒 ,因為我窮得只剩酒。
北上廣里有故事,有夢想,有愛情 ,有八卦,有生活。
來[北上廣]聽聽他們的故事吧
下載IOS版本:http://7x2x43.com1.z0.glb.clouddn.com/bsgwbtt.html
或者appStore 搜北上廣
[北上廣]-獻給專注實現夢想的你