0
我想實現我的iOS應用程序的搜索功能之一。我已經實現了UISearchBar委託。如果有新的請求取消請求
現在,當用戶開始搜索時,它會進行服務API調用。
例如用戶類型:
- 一個
- 鴨
- 應用
- 申請
- 蘋果
所以總共5服務呼叫在很短的時間內做出。 現在我想取消從1到4的所有服務呼叫,我想把第五個作爲我的最終結果。
我使用相同的搜索引擎,發現我應該使用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];
響應有不同的順序:
爲用於爲App
蘋果 5響應鴨 第四響應申請 3ED響應的 第二響應1響應所以,我能做些什麼過來這種行爲?
使用NSURLSession所以,當你需要做的,你可以取消的請求。看看:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –
@霍亞:我嘗試使用NSURLSession,但我從服務器以不同的順序得到響應。請查看我編輯的問題。你能建議我怎麼解決這個問題? – iCoder86
查看我發佈的鏈接中的「查詢曲目」會話。他們解決與你的相同的用例。關鍵的想法是重用相同的dataTask,每次更改搜索文本時,它會取消當前的dataTask(如果啓動)並重新創建新的。 –