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:
- A
- Ap
- App
- Appl
- 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?
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 –
@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
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. –