NSTimer 使其为零并无效后重复调用方法

问题描述 投票:0回答:2

我使用 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];
ios objective-c nstimer
2个回答
0
投票

您是否有理由想要手动将计时器添加到 NSRunLoop 中?这通常是没有必要的。使用

scheduledTimerWithTimeInterval
而不是
timerWithTimeInterval
,创建计时器,如下所示:

self.countDown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES];

这将启动计时器,而无需手动将其添加到 NSRunLoop 中。那么你应该能够通过以下方式停止它:

[self.countDown invalidate];

0
投票

文档说:

  • 无效
    特别注意事项
    您必须从安装了计时器的线程发送此消息。如果您从另一个线程发送此消息,则与计时器关联的输入源可能不会从其运行循环中删除,这可能会阻止线程正常退出。
    也许这就是问题所在?

编辑:

您可以使用

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];

	
© www.soinside.com 2019 - 2024. All rights reserved.