iOS开发中如遇到频繁的Http请求,如何取消之前已经发送的Http请求?
2016-08-26 12:09
302 查看
主要精髓在于
第一点:不要initialize a new AFHTTPSessionManager object everytime 一定要把manager用成全局的
第二点:把请求返回的task对象丢进数组,下次触发的时候把遍历数组,把之前的所有任务[task cancel]
注意:
这里的task cancel亲测确实能把网络请求cancel掉,可以看下面的log,记住一点,这里cancel之后不代表就不回调
了,只是会回调到error的那个block里面,各位需要信息的可以测试下,在error打个断点就能调试出来了
第一点:不要initialize a new AFHTTPSessionManager object everytime 一定要把manager用成全局的
第二点:把请求返回的task对象丢进数组,下次触发的时候把遍历数组,把之前的所有任务[task cancel]
- (void)viewDidLoad { [super viewDidLoad]; /// create the AFHTTPSessionManager object, we're gonna use it in every request self.manager = [[AFHTTPSessionManager alloc] init]; self.manager.responseSerializer = [AFJSONResponseSerializer serializer]; /// create an array that is going to hold the requests task we've sent to the server. so we can get back to them later self.arrayOfTasks = [NSMutableArray new]; /// discussion: /// an array holds multiple objects. if you just want to hold a ref to the latest task object /// then create a property of NSURLSessionDataTask instead of NSMutableArray, and let it point to the latest NSURLSessionDataTask object you create } -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;{ /// your code goes here /// ..... /// ..... /// ..... /// ..... /// till we reach if(stringLength>=3){ /// cancel all previous tasks [self.arrayOfTasks enumerateObjectsUsingBlock:^(NSURLSessionDataTask *taskObj, NSUInteger idx, BOOLBOOL *stop) { [taskObj cancel]; /// when sending cancel to the task failure: block is going to be called }]; /// empty the arraOfTasks [self.arrayOfTasks removeAllObjects]; /// init new task NSURLSessionDataTask *task = [self.manager GET:urlString parameters:nil success:^(NSURLSessionDataTask *task, id responseObject){ /// your code }failure:^(NSURLSessionDataTask *task, NSError *error){ /// your code }]; /// add the task to our arrayOfTasks [self.arrayOfTasks addObject:task]; } return YES; }
注意:
这里的task cancel亲测确实能把网络请求cancel掉,可以看下面的log,记住一点,这里cancel之后不代表就不回调
了,只是会回调到error的那个block里面,各位需要信息的可以测试下,在error打个断点就能调试出来了
// 查看网络任务的状态 [articleInterface.articleArrayTask enumerateObjectsUsingBlock:^(NSURLSessionDataTask *taskObj, NSUInteger idx, BOOLBOOL *stop) { DDLogVerbose(@"当前的文章删除前网络任务状态是==================>>>>>%ld",taskObj.state); [taskObj cancel]; /// when sending cancel to the task failure: block is going to be called DDLogVerbose(@"当前的文章删除后网络任务状态是==================>>>>>%ld",taskObj.state); }]; typedef NS_ENUM(NSInteger, NSURLSessionTaskState) { NSURLSessionTaskStateRunning = 0, /* The task is currently being serviced by the session */ NSURLSessionTaskStateSuspended = 1, NSURLSessionTaskStateCanceling = 2, /* The task has been told to cancel. The session will receive a URLSession:task:didCompleteWithError: message. */ NSURLSessionTaskStateCompleted = 3, /* The task has completed and the session will receive no more delegate notifications */ } NS_ENUM_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0);
相关文章推荐
- iOS开发中如遇到频繁的Http请求,如何取消之前已经发送的Http请求?
- iOS开发中如遇到频繁的Http请求,如何取消之前已经发送的Http请求?
- iOS开发中如遇到频繁的Http请求,取消之前已经发送的Http
- iOS开发 取消之前已经发送的Http请求
- iOS网络开发基础--发送HTTP请求
- ios 蓝牙开发遇到问题,如何保持蓝牙后台发射
- iOS开发--用户点击频繁,多个异步网络请求取消问题?
- iOS开发之旅--本地通知的发送与取消
- 【iOS开发】用户点击频繁,多个异步网络请求取消问题?
- ios开发如何封装AFN第三方类库中的http请求
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- S2SH整合开发中,遇到的国际化问题如何解决?
- 兄弟mfc-7220如何取消打印报告?不管是接收还是发送传真,都打印报告出来,这样浪费一张白纸,怎么去掉?
- ios 开发中遇到 UIAlertView 窗口无法release的问题
- 如何在发布到苹果的App Store之前发送测试版本给客户
- 在iOS开发中如何高效使用静态库
- rails开发利器:如何给苹果PushServer发送消息rails for apple_push_notification
- Flash开发iOS应用全攻略(五)——如何上传应用到iTunes Connect
- Flash开发iOS应用全攻略(三)——如何使用iOS开发者授权以及如何申请证书
- iOS开发:如何使用iOS手势UIGestureRecognizer