如果有新请求则取消请求

问题描述 投票:0回答:1

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

UISearchBar 
代表。

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

例如用户类型:

  1. A
  2. 阿普
  3. 应用程序
  4. 应用
  5. 苹果

所以在很短的时间内总共拨打了 5 次服务电话。 现在我想取消从 1 到 4 的所有服务调用,并且我想将第 5 个服务调用视为我的最终结果。

我用谷歌搜索了同样的内容,发现我应该使用

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
的第三个回复 苹果的第四次回应
应用程序的第五个响应

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

ios objective-c uisearchbar nsoperationqueue
1个回答
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];
    }
}

参考来源:这里

© www.soinside.com 2019 - 2024. All rights reserved.