中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS中AFNetworking如何取消正在進行的網絡請求

發布時間:2021-07-26 10:46:27 來源:億速云 閱讀:256 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關iOS中AFNetworking如何取消正在進行的網絡請求的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

簡介

項目開發時,開發人員經常會遇到一種情況,A控制器push進入B控制器,B控制器正在進行網絡請求,請求未結束時,點擊返回回到A控制器,現在問題出現了,B中網絡請求還在執行,dealloc并未立即調用,為什么會發生這種情況?想在退出當前控制器時取消掉正在進行的請求,怎么做?

網絡請求的封裝

以AFNetworking為例,上我自己的網絡請求封裝主要代碼:

//單例模式
+ (HttpManager *)sharedManager
{
  static dispatch_once_t once;
  dispatch_once(&once, ^{
    httpManager = [[HttpManager alloc] init];
  });
  return httpManager;
}

//網絡類初始化
- (id)init{
  self = [super init];
  if(self)
  {
    manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  }
  return self;
}

注意既然封裝為單例,manager在項目運行期間就只用初始化一次,所以我把它聲明為了一個成員變量。現在來看看我的網絡請求調用形式:

[[HttpManager sharedManager] dataFromWithBaseURL:BaseURL path:url method:@"POST" timeInterval:10 params:parmas success:^(NSURLRequest *request, NSURLResponse *response, id JSON) {
   
 } failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON) {
    
  } error:^(id JSON) {
    
  } finish:^(id JSON) {
    
  }];

相信大部分開發者的封裝格式都是類似的,個別反人類的封裝格式我也沒遇到過。當我在B調用網絡請求時,突然返回到A(此時B中請求還在執行),但是B中dealloc方法并未立即調用,等過幾秒種后,B中請求的數據返回了,然后dealloc才調用。相信很多同學都遇到過這種情況,有人會想是否是block里面有對象產生了循環引用,才發生這種情況。我想說的是,如果真是循環引用,那就會導致控制器的dealloc方法一直不調用,而不是上述情況。

在我看來,應該是使用了這種Block格式發起的網絡請求后,由于還在執行,block里面并未得到響應,所以該block對當前的控制器,有一種強引用的效果,導致控制器退出后,并未釋放掉,直到請求數據返回,block里面得到響應,才算完成,最終調用dealloc方法。

當然,這只是我的見解,有不對的地方請指出來。

取消正在進行的網絡請求

上面講了一大堆廢話,現在來講正題了。由于上述情況的原因,導致我們開發的app在一些非常規操作上,會產生一些不友好的效果。現在要求就是在退出控制器B后,取消還在B中進行的網絡請求。

要求清晰了,那么要怎么實現,其實很簡單,貼上我的代碼:

- (void)cancelRequest
{
  if ([manager.tasks count] > 0) {
    NSLog(@"返回時取消網絡請求");
    [manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    //NSLog(@"tasks = %@",manager.tasks);
  }
}

不要每次請求的時候都去初始化manager(AFHTTPSessionManager)對象,tasks里面裝的就是正在進行的網絡請求,來一張圖就理解了:

iOS中AFNetworking如何取消正在進行的網絡請求

manager里面的tasks裝的就是正在執行的網絡請求。執行cancel后,tasks就會清空,網絡請求會進入失敗的狀態,然后響應failure block,得到一個error的信息,表示請求已經成功取消了。

至于后臺服務器是否會因為中斷請求受影響,空閑的同學可以去測試下。

感謝各位的閱讀!關于“iOS中AFNetworking如何取消正在進行的網絡請求”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彭水| 葫芦岛市| 阿坝县| 涟源市| 错那县| 织金县| 宜宾市| 濉溪县| 论坛| 丹江口市| 红安县| 财经| 当阳市| 尖扎县| 新安县| 拉孜县| 梨树县| 塔河县| 宜黄县| 东安县| 东源县| 丘北县| 晴隆县| 盐池县| 黄龙县| 黄平县| 绵竹市| 汝州市| 怀仁县| 务川| 理塘县| 福鼎市| 和顺县| 洛南县| 荣成市| 房山区| 乐至县| 侯马市| 水城县| 梅河口市| 伊宁县|