在我的项目中实现它之前,我已经用计时器创建了一个测试应用程序。
这是我第一次使用计时器。
但问题是当我使用[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];
实现计时器时,它无效。
这是我的代码,
接口:
@interface uialertViewController : UIViewController
{
NSTimer *timer;
}
-(void)displayAlert;
-(void)hideandview;
@end
实现:
@implementation uialertViewController
- (void)viewDidLoad {
[self displayAlert];
[super viewDidLoad];
}
-(void)displayAlert{
timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO];
alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil];
[alert show];
[alert release];
alert = nil;
}
-(void)hideandview{
NSLog(@"triggered");
[alert dismissWithClickedButtonIndex:0 animated:YES];
[alert release];
[self displayAlert];
}
@end
然后我更改了 [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];
[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];
,它正在运作。 timerWithTimeInterval:
的问题是什么?在第一次实施中,我是否正在处理任何事情?提前谢谢。
答案 0 :(得分:119)
scheduledTimerWithTimeInterval:invocation:repeats:
和scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
创建自动添加到NSRunLoop
的计时器,这意味着您无需自行添加它们。将它们添加到NSRunLoop
是导致它们触发的原因。
使用timerWithTimeInterval:invocation:repeats:
和timerWithTimeInterval:target:selector:userInfo:repeats:
,您必须手动将计时器添加到运行循环中,代码如下:
[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode];
此处的其他答案表明您需要自己致电fire
。你不这样做 - 只要计时器被放置在一个运行循环中就会被调用。
答案 1 :(得分:2)
还有人可能想确保在主线程上添加计时器。
assert(Thread.isMainThread)
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)
答案 2 :(得分:1)
两者之间的区别在于timerWithTimeInterval
方法返回尚未触发的NSTimer
对象。要启动计时器,您必须使用[timer fire];
另一方面,scheduledTimerWithTimeInterval
会返回已被解雇的NSTimer
。
所以,在你的第一个实现中,你只是缺少[timer fire];
答案 3 :(得分:1)
如前一个回答所述,主线程上有日程安排,而不是使用断言,请将其放在主线程上:
@objc func update() {
...
}
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
}
如果不需要异步,请尝试:
let schedule = {
self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
}
if Thread.isMainThread {
schedule()
}
else {
DispatchQueue.main.sync {
schedule()
}
}