2

私は現在実装を後悔していますUISearchDisplayControllerを持っています。問題は、自分の検索コントローラがWebサービスにアクセスし、[tableView reloadData]を呼び出してUITableViewを更新することです。ユーザーがキーを入力するたびに、キーが検索されます。私はASIHTTPRequestを呼び出す前に少なくとも3文字を要求することで症状を部分的に緩和することができましたが、より良い方法が必要です。基本的にはUISearchDisplayControllerをN秒間待つか、ユーザーが検索する前に「検索」を押すようにします。ここに私が今いるもの:UISearchDisplayController - N秒間待つか、検索の前にユーザーが「検索」を押すのを待ちます。

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 

    if (searchString.length > 2) { 

     ASIHTTPRequest *request = [IKRequestBuilder requestForIKDogFoodWithQueryString:searchString]; 
     [request setDelegate:self]; 
     [request startAsynchronous]; 
    } 

    return NO; 
} 

#pragma mark - ASI HTTP Request 

- (void)requestStarted:(ASIHTTPRequest *)request { 
    //show activity view over table view 
} 

- (void)requestFinished:(ASIHTTPRequest *)request { 
    NSString *response = [request responseString]; 
    self.dogFoods = [IKJsonFactory buildIKDogFoodArrayWithJSON:response]; 
    [self.searchDisplayController.searchResultsTableView reloadData]; 
} 

答えて

4

検索デリゲートのプロパティとしてNSTimerを追加します。

shouldReloadTableForSearchString :(NSString *)searchStringデリゲートメソッドでは、リクエストをすぐに送信する代わりに、代わりにタイマーがあるかどうかを確認します。キャンセルする場合は、キャンセルしてから新しいタイマーを開始します。

タイマーのターゲット方法では、検索を開始します。

これは、入力中にタイマーを再作成することを意味します。彼らがタイピングを停止すると、タイマーの最後の化身がn秒で起動します。次に、ボタンを押したときに手動検索を追加するだけです。 (検索が既に開始されているかどうかを確認するブール値を追加することもできます)。

つまり、あなたの代表団のインタフェースで

NSTimer *searchTimer; 

@property (nonatomic, retain) NSTimer *searchTimer; 

その後shouldReloadTableForSearchStringの実装では、代わりにWeb要求をオフに発射する、次の操作を行います。あなたのタイマーターゲットで次に

if (self.searchTimer) { 
    [self.searchTimer invalidate]; 
    self.searchTimer = nil; 
} 
self.searchTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(searchTimerPopped:) userInfo:nil repeats:FALSE]; 

-(void) searchTimerPopped:(NSTimer *)sTimer { 
    // code to fire off the asynchronous web call to do the search 
} 
+0

こんにちはgamozzii、あなたの答えをありがとう - あなたのコードは動作しますが、あなたはclaを使う必要がありますssメソッド '[NSTimer scheduledTimerWithTimeInterval]'ではなく、 '[NSTimer timerWithTimeInterval]'でなければ動作しません。乾杯! –

+0

うれしいこと - 訂正してくれてありがとう。 – gamozzii

関連する問題