NSTimer调用方法在使其成为nill并且无效后重复

时间:2015-11-29 07:38:49

标签: ios api nstimer

我使用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];

2 个答案:

答案 0 :(得分:0)

docs说:

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

编辑:

您可以使用<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Welcome</title> </head> <body> <center>Welcome ${person.username}</center> <form:input name="username"value="${person.password}" /><br> <input type="text" value="${person.username}" disabled="true"/> <center>Your password is ${person.password}</center> <input type="text" value="${person.password}" /> <input type="text" value="${person.story}" /> </body> </html> 而不是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];  

答案 1 :(得分:0)

您是否有理由手动将计时器添加到NSRunLoop?这通常没有必要。使用scheduledTimerWithTimeInterval代替timerWithTimeInterval来创建计时器,如下所示:

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

这将启动计时器,而无需手动将其添加到NSRunLoop。然后你应该能够用以下方法阻止它:

[self.countDown invalidate];