2016-09-20 14 views
0

Ich möchte eine Suchfunktionalität einer meiner iOS-Anwendung implementieren. Ich habe UISearchBar-Delegierte implementiert.Anfrage abbrechen, wenn neue Anfrage gemacht wird

Nun, wenn der Benutzer beginnt mit der Suche macht es einen Service-API-Aufruf.

Zum Beispiel Benutzertypen:

  1. A
  2. Ap
  3. App
  4. Appl
  5. Apple-

So insgesamt 5 Service-Aufruf in sehr kurzer Zeit durchgeführt wird. Jetzt möchte ich alle Service-Anruf von 1 bis 4 abgebrochen und ich möchte die fünfte als mein Endergebnis betrachten.

gegoogelt ich für die gleichen und festgestellt, dass i NSOperationQueue verwenden sollte und den Vorgang abbrechen, wenn sie nicht benötigt werden. Folgendes ist der Code, den ich für das gleiche verwende.

- (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); 
           }]; 
    } 
} 

Ich brauche Hilfe zu dieser Abfrage. Kann mir jemand eine Lösung anbieten, wie kann ich erreichen oder was wäre der beste Weg, um Suchfunktion in iOS App zu implementieren.

Bearbeiten mit NSURLSEssion

Ich habe versucht, mit folgendem Code und wie erhalte ich die Antwort andere Reihenfolge.

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]; 

Antwort in unterschiedlicher Reihenfolge kommen:

erste Antwort für A zweite Antwort für Appl 3ed Antwort für Ap 4. Antwort für Apple 5. Antwort für App

Also, was kann ich tun um dieses Verhalten zu überkommen?

+0

Verwendung NSURLSession, so dass Sie eine Anforderung abbrechen können, wenn Sie tun müssen. Schauen Sie sich auf: https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –

+0

@Hoa: Ich habe versucht, mit NSURLSession, aber ich habe die Antwort vom Server in einer anderen Reihenfolge. Bitte überprüfen Sie meine bearbeitete Frage. Können Sie mir vorschlagen, was ich tun kann, um dieses Problem zu lösen? – iCoder86

+0

Sehen Sie sich in dem Link, den ich gepostet habe, die "Suche nach Tracks" -Sitzung an. Sie lösen den gleichen Anwendungsfall wie Ihres. Die Schlüsselidee besteht darin, dieselbe dataTask wiederzuverwenden. Jedes Mal, wenn Sie den Suchtext ändern, wird die aktuelle dataTask (falls gestartet) abgebrochen und eine neue erstellt. –

Antwort

0

Alternative Lösung:

- (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]; 
    } 
} 

Referenz Von: Here