ios afnetworking取消正在进行的网络请求

栏目: IOS · 发布时间: 6年前

内容简介:项目开发时,开发人员经常会遇到一种情况,A控制器push进入B控制器,B控制器正在进行网络请求,请求未结束时,点击返回回到A控制器,现在问题出现了,B中网络请求还在执行,dealloc并未立即调用,为什么会发生这种情况?想在退出当前控制器时取消掉正在进行的请求,怎么做?以AFNetworking为例,上我自己的网络请求封装主要代码:注意既然封装为单例,manager在项目运行期间就只用初始化一次,所以我把它声明为了一个成员变量。现在来看看我的网络请求调用形式:

简介

项目开发时,开发人员经常会遇到一种情况,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的信息,表示请求已经成功取消了。

至于后台服务器是否会因为中断请求受影响,空闲的同学可以去测试下。

最后

还有一些其它取消请求的方法,就不列出来了,因为要不就没成功,要不就很麻烦,在这就用了一种我认为最简单的方法。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

《生活大爆炸》之科学揭秘

《生活大爆炸》之科学揭秘

乔治·毕姆 / 韩准、徐漪、江业华、叶夜 / 世界图书出版公司 / 2012-12 / 49.00元

《 之科学揭秘:GEEK探索频道》对流行美剧《生活大爆炸》进行“深度解密”,重点在解读剧中涉及的流行文化及科学元素。正如我们所知,《生活大爆炸》是一部“技术含量很高”的肥皂剧。不光是普通观众,科学家也爱《生活大爆炸》。《 之科学揭秘:GEEK探索频道》中,科学家详尽为你解释了电视剧中出现的科学道理和典故。包括谢尔顿的高深弦理论、霍华德的花生过敏是怎么回事、如果你和谢尔顿的妈妈有同样的信仰该如何看待......一起来看看 《《生活大爆炸》之科学揭秘》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具