私のiOSアプリケーションの検索機能を実装したい。 UISearchBarデリゲートを実装しました。新しいリクエストがあった場合にリクエストをキャンセルする
ユーザーが検索を開始すると、サービスAPI呼び出しが行われます。例えば、ユーザータイプについては
:
- のAp
- のApp
- APPL
- アップル
だから、合計5サービスコールは、非常に短い時間で行われます。 1から4までのすべてのサービスコールをキャンセルしたいのですが、私は最終結果として5番目を考慮したいと思います。
私はグーグルと私は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];
異なる順序で来るの応答:APPL のApp
ための第五応答だから私は何ができるのアップル ためのAp 第四応答のための3ED応答のための 第二応答のための
第一応答何度もこの現象が起こるでしょうか?
あなたはあなたがする必要がある要求を取り消すことができるようにNSURLSessionを使用しています。 http://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –
@Hoa:私はNSURLSessionを試しましたが、私は異なる順序でサーバーからの応答を得ました。編集した質問を確認してください。あなたはその問題を解決するために何ができるのですか? – iCoder86
私が投稿したリンクの "Tracking for Tracks"セッションを見てみましょう。彼らはあなたと同じユースケースを解決します。重要なアイデアは、同じデータタスクを再利用することです。検索テキストを変更するたびに、現在のdataTaskがキャンセルされ、新しいデータタスクが再作成されます。 –