我使用 nstimer 创建 60 秒的倒计时器。每秒钟我都会调用一个方法来更新按钮的文本。这个东西运行良好,但是一旦我离开视图控制器并转到其他视图并返回到同一视图,该方法每次都会被连续调用,并且按钮文本的更改也不起作用,也不会调用其中的 API 调用。就像它正在调用每个方法和所有内容,但它在视图控制器中没有改变:
self.countDown = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.countDown forMode:NSDefaultRunLoopMode];
您是否有理由想要手动将计时器添加到 NSRunLoop 中?这通常是没有必要的。使用
scheduledTimerWithTimeInterval
而不是 timerWithTimeInterval
,创建计时器,如下所示:
self.countDown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES];
这将启动计时器,而无需手动将其添加到 NSRunLoop 中。那么你应该能够通过以下方式停止它:
[self.countDown invalidate];
文档说:
编辑:
您可以使用
currentRunLoop
而不是 [NSRunLoop mainRunLoop]
将计时器添加到主线程的运行循环中,即 [NSRunLoop currentRunLoop]
要从主线程使其无效,您可以使用
self.countDown = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.countDown forMode:NSDefaultRunLoopMode];