0

我试图立即停止我的 NSTimer(不重复),但我不能。我的 NSTimer 执行以下代码:

-(void)timerAction:(NSTimer*)timer{
    dispatch_queue_t serverDelaySimulationThread = dispatch_queue_create("com.xxx.serverDelay", nil);
    dispatch_async(serverDelaySimulationThread, ^{
        [NSThread sleepForTimeInterval:2.0];
        dispatch_async(dispatch_get_main_queue(), ^{
            //CALL WEBSERVICE RESPONSE IN HERE
        });
    });
}

每次 textField 发生变化时,我都会使 NSTimer 无效并重新创建 NSTimer!如果 2 次用户键入字符之间的延迟时间大于 2 秒,我只想执行对 WEBSERVICES 的请求。我的代码如下

-(void) textFieldDidChange:(id)sender{
    [MyTimer invalidate];
    MyTimer = nil;
    MyTimer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerAction:) userInfo:nil repeats:NO];
}

但是,当我快速键入“ABCD”-> 2 秒后,调用了 4 个 Web 服务。我如何在 NSTimer 未完成时停止它

谢谢提前!

4

3 回答 3

2
-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    [myTimer invalidate];
    myTimer = nil;
    myTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self    selector:@selector(timerFired) userInfo:nil repeats:NO];
    return YES;
}

这对我有用。

于 2013-10-25T12:57:47.197 回答
1

您的计时器 timeInterval 设置为 0。因此,每次您键入计时器时都会触发。将您的代码更改为如下所示

MyTimer = [NSTimer scheduledTimerWithTimeInterval:2.0
    target:self selector:@selector(timerAction:) userInfo:nil repeats:NO];

它应该工作:)

于 2013-10-25T12:41:40.040 回答
0

问题是您正在实施 textdidchange 委托。那么你输入文本的次数。它会被调用。所以里面你写了四个字母。所以肯定你的 NSTimer 调用了你的网络服务的四倍。我建议更好地使用- (void)controlTextDidEndEditing:(NSNotification *)aNotification,这样每当您输入或退出您的网络服务时都会调用。

于 2013-10-25T12:55:18.830 回答