立即停止NSTimer

时间:2013-10-25 12:36:31

标签: objective-c nstimer

我试图立即停止我的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 Did Change,我都会使NSTimer无效并重新创建NSTimer !!如果用户输入大于2s的字符的2倍之间的延迟时间,我想要执行对WEBSERVICES的请求。我的代码正在关注

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

但是,当我快速输入“ABCD” - > 2s之后,调用了4个webservices。 如何在未完成时停止NSTimer

提前预约!

3 个答案:

答案 0 :(得分: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;
}

这对我有用。

答案 1 :(得分:1)

您的计时器timeInterval设置为0.因此每次键入计时器时都会触发。将代码更改为这样

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

它应该有效:)

答案 2 :(得分:0)

问题是你正在实现textdidchange委托。那么你输入文字的次数。它会被调用。你在里面写了四封信。所以你的NSTimer绝对是你的网络服务的四倍。我建议最好使用- (void)controlTextDidEndEditing:(NSNotification *)aNotification这样,无论何时输入或标签都会调用您的网络服务。