UISearchDisplayController - подождите N секунд ИЛИ пока пользователь не нажмет «Поиск», прежде чем проводить поиск - PullRequest
2 голосов
/ 19 февраля 2012

У меня есть UISearchDisplayController, о котором я сейчас сожалею.Проблема в том, что мой контроллер поиска получает доступ к веб-службе, а затем обновляет UITableView, вызывая [tableView reloadData].Каждый раз, когда пользователь вводит ключ, он ищет.Мне удалось частично облегчить симптомы, потребовав по крайней мере три символа перед вызовом ASIHTTPRequest, но должен быть лучший способ.В основном я хочу, чтобы 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];
}

1 Ответ

4 голосов
/ 19 февраля 2012

Добавьте NSTimer в качестве свойства для вашего поискового делегата.

В mustReloadTableForSearchString: (NSString *) метод делегата searchString вместо прямой отправки запроса вместо этого проверьте, есть ли у вас уже таймер, если это так, отмените его, а затем запустите новый таймер.

В целевом методе таймера начните поиск.

Это будет означать, что пока они будут печатать, вы продолжите воссоздавать таймер. Когда они прекратят печатать, последнее воплощение таймера сработает через n секунд. Тогда вам просто нужно также добавить ручной запуск поиска, когда они нажимают кнопку. (Вы также можете добавить логическое значение, чтобы проверить, был ли поиск уже начат).

т.е. в интерфейсе ваших делегатов

NSTimer *searchTimer;

@property (nonatomic, retain) NSTimer *searchTimer;

Затем в вашей реализации shouldReloadTableForSearchString вместо запуска веб-запроса сделайте следующее:

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
}
...