gpt4 book ai didi

详解iOS AFNetworking取消正在进行的网络请求

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解iOS AFNetworking取消正在进行的网络请求由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

简介 。

项目开发时,开发人员经常会遇到一种情况,A控制器push进入B控制器,B控制器正在进行网络请求,请求未结束时,点击返回回到A控制器,现在问题出现了,B中网络请求还在执行,dealloc并未立即调用,为什么会发生这种情况?想在退出当前控制器时取消掉正在进行的请求,怎么做?

网络请求的封装 。

以AFNetworking为例,上我自己的网络请求封装主要代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//单例模式
+ (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在项目运行期间就只用初始化一次,所以我把它声明为了一个成员变量。现在来看看我的网络请求调用形式

?
1
2
3
4
5
6
7
8
9
[[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中进行的网络请求.

要求清晰了,那么要怎么实现,其实很简单,贴上我的代码:

?
1
2
3
4
5
6
7
8
- ( 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的信息,表示请求已经成功取消了.

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

最后 。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://www.jianshu.com/p/e3ee40181baf 。

最后此篇关于详解iOS AFNetworking取消正在进行的网络请求的文章就讲到这里了,如果你想了解更多关于详解iOS AFNetworking取消正在进行的网络请求的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com