Я хочу реализовать функцию поиска одного из моих приложений iOS. Я реализовал делегатов UISearchBar.Отмените запрос, если новый запрос сделан
Теперь, когда пользователь начинает поиск, он вызывает вызов API службы.
Например типов пользователей:
- Ap
- App
- Appl
- Яблоко
Так общий вызов 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
Так что я могу сделать чтобы преодолеть это поведение?
использования NSURLSession, так что вы можете отменить запрос, если вам нужно сделать. Взгляните на: https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –
@Hoa: Я пытался с NSURLSession, но получил ответ от сервера в другом порядке. Пожалуйста, просмотрите мой отредактированный вопрос. Можете ли вы предложить мне, что я могу сделать, чтобы решить эту проблему? – iCoder86
Взгляните на сеанс «Запрос на треки» в ссылке, которую я опубликовал. Они разрешают тот же случай использования, что и ваш. Основная идея состоит в том, чтобы повторно использовать один и тот же dataTask, каждый раз, когда вы меняете текст поиска, он отменяет текущую dataTask (если она запущена) и воссоздает новую. –