iOS - 延迟后的Web服务请求

时间:2012-09-04 18:09:58

标签: iphone ios ipad delayed-execution performselector

我有一个搜索栏,其中包含一个建议UITableView,可以在用户输入时填充(使用JSON服务)。这些服务调用需要在延迟500ms的非打字后进行。如果用户开始输入500ms的这段时间,则需要取消队列中的当前呼叫,并且应用程序必须等待另外500ms的非活动,然后才能进行另一次afterDelay呼叫。我知道在这整个情况下我必须使用performSelector:withObject:afterDelay,但我无法适应条件。我尝试使用一堆bool但它只是变脏......任何帮助?

2 个答案:

答案 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方法中。