0

我正在实施诸如实时搜索之类的东西。例如,如果我写“p”,它会在服务器中进行查询,而“pi”会进行另一个查询。因此,每个写入的字符都会使应用程序向服务器发出请求。

但是,在一些字符之后,如果我立即开始删除,因为所有请求都是异步的,因为搜索栏中没有字符,旧请求会得到一些结果并加载到表中。

我的代码是:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
[[ApiClient sharedClient] cancelAllHTTPOperationsWithMethod:@"GET" path:@"cuisines/search/"];

if(![searchText length]){
    [self.searchList removeAllObjects];
    [self.searchTableView reloadData];
}
else if([searchText length] > 0){
    if(searchBar == leftSearchBar){
        [[ApiClient sharedClient] getPath:[[NSString stringWithFormat:@"cuisines/search/?q=%@&locale=%@", searchText, locale] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            [self.searchList removeAllObjects];
            NSMutableArray* list = [responseObject valueForKeyPath:@"cuisines"];
            if(list.count > 0){
                for (id c in list) {
                    Cuisine *cuisine = [[Cuisine alloc] initWithAttributes:c];
                    [self.searchList addObject:cuisine];
                }
            }  
            [self.searchTableView reloadData];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(error.description);
        }];           
     }    
   }    
}

那么,当发出新请求时,如何停止先前的请求呢?

编辑:

我在 texDidChange 的开头写了取消请求。但它是一样的。我有个问题:

路径:

cancelAllHTTPOperationsWithMethod:@"GET" path:@"cuisines/search/"];

cancelAllHTTPOperationsWithMethod:@"GET" path @"cuisines/search/?q=%@&locale=%@", searchText, locale] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]

是因为根都一样吗?如果不是,我怎样才能找到并取消请求?

4

1 回答 1

0

当文本发生变化时,您应该检查是否已经有请求并cancelAllHTTPOperationsWithMethod:path立即取消它。您已经在第 3 行执行此操作,但前提是文本为空。如果您总是这样做,它将永远不允许同时发出 2 个请求。

于 2013-01-24T15:24:18.913 回答