如何使NSTimer无效?

时间:2013-03-05 06:24:14

标签: ios

self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopProgressView) userInfo:nil repeats:NO];

-(void)stopProgressView
{
    if ([self.timerProgress isValid]) {
        [self.timerProgress invalidate];
        self.timerProgress=nil;
    }  

}

并在我尝试使NSTimer对象无效时单击按钮

-(void)cancelTimer
{
       if ([self.timerProgress isValid]) {
            [self.timerProgress invalidate];
            self.timerProgress=nil;
        }   
}

它不会失效。它在50的间隔之后调用一次stopProgressView。 如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

- (IBAction)stopTimer {
    if ([timerProgress isValid]) {
        [timerProgress invalidate];
    }
}

请勿使用self.timerProgress仅使用timerProgress

答案 1 :(得分:1)

最可能的原因是您的计时器在不同的运行循环上安排到您尝试使用的计时器并使其无效。

定时器必须在与调度它们的运行循环相同的线程/ runloop上失效。

Cocoa touch不是线程安全的,因此您应该在主线程上运行所有与UI相关的活动。如果您在不同的线程上进行GUI工作,它可能会起作用,但随后您会发生随机崩溃,并且您还会产生这样的计时器问题。

答案 2 :(得分:0)

似乎你发布的内容应该可行。这就是我在我的应用程序中使用它的方法,它运行正常。

但是,您可以尝试使选择器成为一个定时器对象,如:

-(void)stopProgressView:(NSTimer *)timer{
     //do stuff with timer here
}

请注意,这也意味着您应该将@selector(stopProgressView)更改为@selector(stopProgressView :)。虽然对于记录我的当前停止计时器功能只使用[self.timer invalidate]并且它工作正常。

我对调试的另一个建议是使用NSLog来确保每个方法实际上都被调用,并且当在if子句中调用该方法以确保其有效时。

答案 3 :(得分:0)

您使用NSTimer创建NSRunLoop,以便NSTimer未启动,以便在

之后添加此代码
self.timerProgress = [NSTimer scheduledTimerWithTimeInterval:50.0 
                                                      target:self 
                                                    selector:@selector(stopProgressView) 
                                                    userInfo:nil
                                                     repeats:NO];

 //add  

[[NSRunLoop currentRunLoop] addTimer:_tapTimer 
                             forMode:NSDefaultRunLoopMode];