在我的应用程序中,我有以下设置来运行NSTimer的操作:
在m。文件:
@implementation MYViewController {
NSTimer *aTimer;
}
然后,当用户点击我的相关按钮时:
- (IBAction)userClick:(id)sender {
aTimer = [NSTimer timerWithTimeInterval:1.0
target:self
selector:@selector(doSomethingWithTimer:)
userInfo:nil
repeats:YES];
//[aTimer fire]; //NSTimer was fired just once.
}
我也有:
-(void)doSomethingWithTimer:(NSTimer*)timer {
NSLog(@"something to be done");
}
我希望在领事中有一句话说"要做的事情"每一秒钟。计时器甚至不会被调用一次。我已经尝试使用[aTimer fire]来触发NSTimer,但它只触发一次并且不会像我期望的那样重复。
有人可以指导我如何处理这个问题吗?
答案 0 :(得分:9)
使用
- (NSTimer *)scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
然后您不必手动将其添加到运行循环中。
答案 1 :(得分:4)
您需要将计时器添加到运行循环中:
[[NSRunLoop mainRunLoop] addTimer:aTimer forMode:NSDefaultRunLoopMode];
答案 2 :(得分:1)
这里的问题是范围。您的aTimer
变量必须是一个字段,因此一旦您离开userClick
方法就不会获得GC。
NSTimer *timer;
...
- (IBAction)userClick:(id)sender {
if (timer != nil && [timer isValid]) {
[timer invalidate];
timer = nil;
}
timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(doSomethingWithTimer:)
userInfo:nil
repeats:YES];
}