我有一个搜索栏,其中包含一个建议UITableView
,可以在用户输入时填充(使用JSON服务)。这些服务调用需要在延迟500ms的非打字后进行。如果用户开始输入500ms的这段时间,则需要取消队列中的当前呼叫,并且应用程序必须等待另外500ms的非活动,然后才能进行另一次afterDelay
呼叫。我知道在这整个情况下我必须使用performSelector:withObject:afterDelay
,但我无法适应条件。我尝试使用一堆bool但它只是变脏......任何帮助?
答案 0 :(得分:7)
我会使用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];
}
答案 1 :(得分:6)
假设您正在检测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
}
我喜欢这个appraoch这样的问题,因为这意味着我不必使用NSTimer
或跟踪我是否等待查看是否输入更多文本的任何状态。希望这可以帮助!如果您有任何问题,请告诉我。
编辑:看到您正在使用搜索栏。原理是一样的,只需将取消/执行配对放在适当的UISearchBarDelegate
方法中。