美文网首页
iOS 取消网络请求

iOS 取消网络请求

作者: Jimmy_阿达 | 来源:发表于2017-11-16 16:10 被阅读255次

    第一点:不要initialize a new AFHTTPSessionManager object everytime 一定要把manager用成全局的
    第二点:把请求返回的task对象丢进数组,下次触发的时候把遍历数组,把之前的所有任务[task cancel]

    // somewhere in your class, let's say in ViewDidLoad you should init the AFHTTPSessionManager object  
    - (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打个断点就能调试出来了

    参考文章链接:http://blog.csdn.net/deft_mkjing/article/details/51985232

    相关文章

      网友评论

          本文标题:iOS 取消网络请求

          本文链接:https://www.haomeiwen.com/subject/qaolvxtx.html