iOS - запрос веб-сервиса после задержки
У меня есть панель поиска с предложениями UITableView
который заполняется (используя службы JSON) в качестве пользовательских типов. Эти сервисные вызовы должны быть сделаны после задержки 500 мс времени отсутствия набора. Если пользователь начинает вводить в этот период 500 мс, текущий вызов в очереди должен быть отменен, и приложение должно ждать еще 500 мс бездействия, прежде чем сделать еще один afterDelay
вызов. Я знаю, что должен использовать performSelector:withObject:afterDelay
во всей этой ситуации, но я не могу обойтись с надлежащими условиями. Я пытался использовать кучу bools, но он просто пачкается... Любая помощь?
2 ответа
Я бы использовал NSTimer
вместо performSelector:withObject:afterDelay:
, Определить, когда текст изменяется в UISearchBar
и сбросьте таймер.
-(void)viewDidLoad {
search.delegate = self;
}
-(void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
[timer invalidate];
timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(callTheService) userInfo:nil repeats:NO];
}
Как насчет этого, предполагая, что вы обнаруживаете ввод в UITextFieldDelegate
метод:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(sendNetworkRequest) object:nil];
[self performSelector:@selector(sendNetworkRequest) withObject:nil afterDelay:0.5];
return YES;
}
- (void)sendNetworkRequest
{
// Here immediately send the request
}
Мне нравится это приближение к таким проблемам, так как это означает, что мне не нужно использовать NSTimer
или отслеживать любое состояние, жду ли я, чтобы увидеть, введен ли еще текст или нет. Надеюсь это поможет! Дайте знать, если у вас появятся вопросы.
РЕДАКТИРОВАТЬ: увидел, что вы используете панель поиска вместо. Принцип тот же, просто отмените / выполните сопряжение в соответствующем UISearchBarDelegate
метод.