2016-09-20 5 views
0

Я хочу реализовать функцию поиска одного из моих приложений iOS. Я реализовал делегатов UISearchBar.Отмените запрос, если новый запрос сделан

Теперь, когда пользователь начинает поиск, он вызывает вызов API службы.

Например типов пользователей:

  1. Ap
  2. App
  3. Appl
  4. Яблоко

Так общий вызов 5 обслуживание производится в очень короткое время. Теперь я хочу отменить все служебные вызовы, сделанные с 1 по 4, и я хочу рассмотреть пятый в качестве моего окончательного результата.

Я googled для того же самого и нашел, что я должен использовать 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 2 ответа на Appl 3ED ответ на Ap 4 ответ на Apple, 5 ответ на App

Так что я могу сделать чтобы преодолеть это поведение?

+0

использования NSURLSession, так что вы можете отменить запрос, если вам нужно сделать. Взгляните на: https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –

+0

@Hoa: Я пытался с NSURLSession, но получил ответ от сервера в другом порядке. Пожалуйста, просмотрите мой отредактированный вопрос. Можете ли вы предложить мне, что я могу сделать, чтобы решить эту проблему? – iCoder86

+0

Взгляните на сеанс «Запрос на треки» в ссылке, которую я опубликовал. Они разрешают тот же случай использования, что и ваш. Основная идея состоит в том, чтобы повторно использовать один и тот же dataTask, каждый раз, когда вы меняете текст поиска, он отменяет текущую dataTask (если она запущена) и воссоздает новую. –

ответ

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

Смежные вопросы