0

リアルタイム検索のようなものを実装しています。たとえば、「p」と書くと、サーバーにクエリが作成され、「pi」は別のクエリが作成されます。したがって、書き込まれたすべての文字により、アプリはサーバーにリクエストを送信します。

ただし、いくつかの文字の後、すぐに削除を開始すると、検索バーに文字がないため、すべてのリクエストが非同期であるため、古いリクエストが結果を取得してテーブルにロードされます。

私のコードは次のとおりです。

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
[[ApiClient sharedClient] cancelAllHTTPOperationsWithMethod:@"GET" path:@"cuisines/search/"];

if(![searchText length]){
    [self.searchList removeAllObjects];
    [self.searchTableView reloadData];
}
else if([searchText length] > 0){
    if(searchBar == leftSearchBar){
        [[ApiClient sharedClient] getPath:[[NSString stringWithFormat:@"cuisines/search/?q=%@&locale=%@", searchText, locale] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            [self.searchList removeAllObjects];
            NSMutableArray* list = [responseObject valueForKeyPath:@"cuisines"];
            if(list.count > 0){
                for (id c in list) {
                    Cuisine *cuisine = [[Cuisine alloc] initWithAttributes:c];
                    [self.searchList addObject:cuisine];
                }
            }  
            [self.searchTableView reloadData];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(error.description);
        }];           
     }    
   }    
}

では、新しいリクエストが行われたときに以前のリクエストを停止するにはどうすればよいですか?

編集:

texDidChangeの冒頭にキャンセルリクエストを書きました。しかし、それは同じです。質問があります:

パス:

cancelAllHTTPOperationsWithMethod:@"GET" path:@"cuisines/search/"];

cancelAllHTTPOperationsWithMethod:@"GET" path @"cuisines/search/?q=%@&locale=%@", searchText, locale] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]

ルートのために同じですか?そうでない場合、どうすればリクエストを見つけてキャンセルできますか?

4

1 に答える 1

0

テキストが変更されたら、すでにリクエストがあるかどうかを確認し、cancelAllHTTPOperationsWithMethod:pathすぐにキャンセルする必要があります。これはすでに 3 行目で行っていますが、テキストが空の場合のみです。常にこれを行うと、2 つの要求が同時に行われることはありません。

于 2013-01-24T15:24:18.913 に答える