我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

iOS中AFNetworking如何取消正在进行的网络请求-创新互联

这篇文章给大家分享的是有关iOS中AFNetworking如何取消正在进行的网络请求的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

成都创新互联是专业的蟠龙网站建设公司,蟠龙接单;提供成都网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行蟠龙网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

简介

项目开发时,开发人员经常会遇到一种情况,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如何取消正在进行的网络请求”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:iOS中AFNetworking如何取消正在进行的网络请求-创新互联
新闻来源:http://mswzjz.cn/article/cdpsij.html

其他资讯