我在我的项目实施前已经创建了一个计时器测试应用程序。 这是我第一次使用定时器。 但问题是,当我使用实施计时器[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:
难道我mising在我的第一个执行什么? 提前致谢。
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
自己。 你不 - 会尽快计时器已经提上一个运行循环调用。
另外一个可能想确保在主线程上添加计时器。
assert(Thread.isMainThread)
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)
两者之间的区别是, timerWithTimeInterval
方法返回NSTimer
还没有被解雇的对象。 要解雇你必须使用计时器[timer fire];
在另一方面, scheduledTimerWithTimeInterval
返回NSTimer
已经被解雇了。
所以,在你第一次实现你只是缺少[timer fire];
正如前面的回答指出,主线程上日程,但不是使用断言,把它在主线程上:
@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()
}
}