UISearchDisplayController и ленивая загрузка изображений - PullRequest
0 голосов
/ 04 сентября 2011

Я использую UITableView в сочетании с UISearchDisplayController для выполнения поиска в массиве данных таблицы.

для каждой строки показанного изображения выбирается из сети и кэшируется локально.

проблема в том, что когда пользователь вводит поисковый запрос, каждая клавиша запускает вызов shouldReloadTableForSearchString, который я использую для запуска онлайн-загрузки изображений.Если пользователь быстро наберет, он создаст несколько сетевых запросов, к тому времени, когда выборка сети будет завершена, строка, вызвавшая его, может больше не существовать, так как поиск был изменен.

Я подумал, что мне нужно подождать, покапользователь перестает печатать перед тем, как сделать сетевой запрос, но пока не может найти способ сделать это с помощью UISearchBar и UITableView ..

есть идеи?

1 Ответ

1 голос
/ 04 сентября 2011

Вам необходимо установить таймер на каждое нажатие клавиши.Допустим, вы предполагаете, что пользователь прекратил печатать, если последний ход был получен 1 секунду назад.Вместо возврата YES из shouldReloadTableForSearchString: вы должны запланировать таймер.Если другой ход клавиши получен до истечения 1 секунды, отключите таймер и сбросьте его.

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    if(myTimer) //a timer is already scheduled. Invalidate it.
    {
        [myTimer invalidate]; //myTimer is an iVar
        myTimer = nil;
    }

    myTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:1] interval:0 target:self selector:@selector(search:) userInfo:searchString repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];          
    return NO;
} 

- (void)search:(NSTimer*)theTimer
{
      //make network request here
}

Вызов [self.searchDisplayController.searchResultsTableView reloadData]; при получении ответа от сетевого вызова.

...