如果发出新请求,请取消请求

时间:2016-09-20 08:15:32

标签: ios api uisearchbar nsoperationqueue

我想在我的iOS应用程序中实现一个搜索功能。我已经实现了UISearchBar委托。

现在,当用户开始搜索时,它会进行服务API调用。

例如用户类型:

  1. A
  2. 应用
  3. 申请
  4. 苹果
  5. 因此,在很短的时间内完成了5次服务呼叫。 现在我想取消从1到4的所有服务电话,我想将第5个作为我的最终结果。

    我用google搜索相同的内容,发现我应该使用NSOperationQueue并在不需要时取消操作。以下是我正在使用的代码。

    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
        if (searchText.length > 0) {
            [self filterContentForSearchText:searchText];
        }
    }
    
    - (void)filterContentForSearchText:(NSString*)searchText {
    
        if ([session isInternetAvailable:NO]) {
                if (!downloadQ) downloadQ = [[NSOperationQueue alloc] init];
                if (downloadQ) {
                    [downloadQ cancelAllOperations];
                    NSLog(@"**********cancelAllOperations**********: %@",downloadQ.name);
                }
                downloadQ.name = searchText;
    
                NSString *strURL = [NSString stringWithFormat:@"http://192.168.1.192:8080/api/user/find/%@/",searchText];
                NSURL *url = [NSURL URLWithString:[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
                NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url
                                                                      cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                                  timeoutInterval:30];
    
                [urlRequest setHTTPMethod:@"GET"];
                [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
                [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
                [NSURLConnection sendAsynchronousRequest:urlRequest
                                               queue:downloadQ
                                   completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                                       NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                       NSLog(@"===> %@",result);
                                   }];
        }
    }
    

    我需要有关此查询的帮助。任何人都可以为我提供一些解决方案,如何实现或在iOS应用程序中实现搜索功能的最佳方式。

    使用NSURLSEssion进行编辑

    我尝试使用以下代码,我如何获得响应是不同的顺序。

        NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    defaultConfigObject.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
    NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration:defaultConfigObject
                                                                      delegate:nil
                                                                 delegateQueue:[NSOperationQueue mainQueue]];
    
    NSString *strURL = [NSString stringWithFormat:@"%@/user/find/%@/",LIVE_SERVICE_HOST_URL,searchText];
    NSURL *dataURL = [NSURL URLWithString:strURL];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:dataURL];
    [urlRequest setHTTPMethod:@"GET"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
    [[delegateFreeSession dataTaskWithRequest:urlRequest
                            completionHandler:^(NSData *data, NSURLResponse *response,
                                                NSError *error){
            NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@===> %@",searchText,result);
    }] resume];
    

    响应的顺序不同:

    对A的第一反应 Appl的第二个回复 对Ap的3ed响应 第四回应是Apple App的第5个回复

    那么我能做些什么来克服这种行为?

1 个答案:

答案 0 :(得分:0)

替代解决方案:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    if ([searchText length] <= 0) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(filterContentForSearchText) object:self];
        [self performSelector:@selector(filterContentForSearchText) withObject:self afterDelay:0.5];
    }
}

参考来自:Here