该方法也是从stackOverFlow上找来的,真的是找死我了
以上面的代码段为例,他是这么操作的
主要精髓在于
第一点:不要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;
- }