2016-09-20 12 views
0

私のiOSアプリケーションの検索機能を実装したい。 UISearchBarデリゲートを実装しました。新しいリクエストがあった場合にリクエストをキャンセルする

ユーザーが検索を開始すると、サービスAPI呼び出しが行われます。例えば、ユーザータイプについては

  1. のAp
  2. のApp
  3. APPL
  4. アップル

だから、合計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応答のための 第二応答のための

第一応答何度もこの現象が起こるでしょうか?

+0

あなたはあなたがする必要がある要求を取り消すことができるようにNSURLSessionを使用しています。 http://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –

+0

@Hoa:私はNSURLSessionを試しましたが、私は異なる順序でサーバーからの応答を得ました。編集した質問を確認してください。あなたはその問題を解決するために何ができるのですか? – iCoder86

+0

私が投稿したリンクの "Tracking for Tracks"セッションを見てみましょう。彼らはあなたと同じユースケースを解決します。重要なアイデアは、同じデータタスクを再利用することです。検索テキストを変更するたびに、現在のdataTaskがキャンセルされ、新しいデータタスクが再作成されます。 –

答えて

0

代替ソリューション:

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

リファレンスから:Here

関連する問題