日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求

這篇文章給大家分享的是有關(guān)iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

麻城網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,麻城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為麻城1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的麻城做網(wǎng)站的公司定做!

簡(jiǎn)介

項(xiàng)目開(kāi)發(fā)時(shí),開(kāi)發(fā)人員經(jīng)常會(huì)遇到一種情況,A控制器push進(jìn)入B控制器,B控制器正在進(jìn)行網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求未結(jié)束時(shí),點(diǎn)擊返回回到A控制器,現(xiàn)在問(wèn)題出現(xiàn)了,B中網(wǎng)絡(luò)請(qǐng)求還在執(zhí)行,dealloc并未立即調(diào)用,為什么會(huì)發(fā)生這種情況?想在退出當(dāng)前控制器時(shí)取消掉正在進(jìn)行的請(qǐng)求,怎么做?

網(wǎng)絡(luò)請(qǐng)求的封裝

以AFNetworking為例,上我自己的網(wǎng)絡(luò)請(qǐng)求封裝主要代碼:

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

//網(wǎng)絡(luò)類(lèi)初始化
- (id)init{
  self = [super init];
  if(self)
  {
    manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  }
  return self;
}

注意既然封裝為單例,manager在項(xiàng)目運(yùn)行期間就只用初始化一次,所以我把它聲明為了一個(gè)成員變量?,F(xiàn)在來(lái)看看我的網(wǎng)絡(luò)請(qǐng)求調(diào)用形式:

[[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) {
    
  }];

相信大部分開(kāi)發(fā)者的封裝格式都是類(lèi)似的,個(gè)別反人類(lèi)的封裝格式我也沒(méi)遇到過(guò)。當(dāng)我在B調(diào)用網(wǎng)絡(luò)請(qǐng)求時(shí),突然返回到A(此時(shí)B中請(qǐng)求還在執(zhí)行),但是B中dealloc方法并未立即調(diào)用,等過(guò)幾秒種后,B中請(qǐng)求的數(shù)據(jù)返回了,然后dealloc才調(diào)用。相信很多同學(xué)都遇到過(guò)這種情況,有人會(huì)想是否是block里面有對(duì)象產(chǎn)生了循環(huán)引用,才發(fā)生這種情況。我想說(shuō)的是,如果真是循環(huán)引用,那就會(huì)導(dǎo)致控制器的dealloc方法一直不調(diào)用,而不是上述情況。

在我看來(lái),應(yīng)該是使用了這種Block格式發(fā)起的網(wǎng)絡(luò)請(qǐng)求后,由于還在執(zhí)行,block里面并未得到響應(yīng),所以該block對(duì)當(dāng)前的控制器,有一種強(qiáng)引用的效果,導(dǎo)致控制器退出后,并未釋放掉,直到請(qǐng)求數(shù)據(jù)返回,block里面得到響應(yīng),才算完成,最終調(diào)用dealloc方法。

當(dāng)然,這只是我的見(jiàn)解,有不對(duì)的地方請(qǐng)指出來(lái)。

取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求

上面講了一大堆廢話,現(xiàn)在來(lái)講正題了。由于上述情況的原因,導(dǎo)致我們開(kāi)發(fā)的app在一些非常規(guī)操作上,會(huì)產(chǎn)生一些不友好的效果?,F(xiàn)在要求就是在退出控制器B后,取消還在B中進(jìn)行的網(wǎng)絡(luò)請(qǐng)求。

要求清晰了,那么要怎么實(shí)現(xiàn),其實(shí)很簡(jiǎn)單,貼上我的代碼:

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

不要每次請(qǐng)求的時(shí)候都去初始化manager(AFHTTPSessionManager)對(duì)象,tasks里面裝的就是正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求,來(lái)一張圖就理解了:

iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求

manager里面的tasks裝的就是正在執(zhí)行的網(wǎng)絡(luò)請(qǐng)求。執(zhí)行cancel后,tasks就會(huì)清空,網(wǎng)絡(luò)請(qǐng)求會(huì)進(jìn)入失敗的狀態(tài),然后響應(yīng)failure block,得到一個(gè)error的信息,表示請(qǐng)求已經(jīng)成功取消了。

至于后臺(tái)服務(wù)器是否會(huì)因?yàn)橹袛嗾?qǐng)求受影響,空閑的同學(xué)可以去測(cè)試下。

感謝各位的閱讀!關(guān)于“iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


本文標(biāo)題:iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求
文章源于:http://www.dlmjj.cn/article/jddjjj.html