我正在尝试安排GNUStep Objective-C方法调用,以每秒可变的秒数运行。我正在尝试使用NSTimer来调度方法调用,但永远不会调用处理程序方法。
这是我的代码:
Timer.m
:
- (id) init {
self = [super init];
if(self) {
_ticks = 0;
}
return self;
}
- (void) startWithTicks: (unsigned int) ticks {
_ticks = ticks; //_ticks is an unsigned int instance variable
if(_ticks > 0) {
[NSTimer scheduledTimerWithTimeInterval: 1.0
target: self
selector: @selector(onTick:)
userInfo: nil
repeats: YES];
}
}
- (void) onTick: (NSTimer*) timer {
NSLog(@"tick");
_ticks--;
if(_ticks == 0) {
[timer invalidate];
timer = nil;
}
}
main.m
:
int main(int argc, const char* argv[]) {
Timer* t = [[Timer alloc] init];
NSLog(@"Setting timer");
[t startWithTicks: 3];
usleep(5000);
NSLog(@"End of timer");
return 0;
}
我希望输出是
Setting timer
tick
tick
tick
End of timer
但是,输出是
Setting timer
End of timer
这是为什么,我该如何解决?
答案 0 :(得分:3)
当线程处于睡眠状态时,计时器不会运行。
如果您从ViewController中使用计时器类代码,则可以正常工作。
如果您想在main方法中使用它,则需要显式运行mainRunLoop。尝试将主要方法调整为此:
int main(int argc, char * argv[]) {
Timer *timer = [[Timer alloc] init];
NSLog(@"Setting Timer");
[timer startWithTicks:3];
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
NSLog(@"End of Timer");
return 0;
}
将mainRunLoop运行3秒钟,这将产生所需的输出。
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html https://developer.apple.com/documentation/foundation/nsrunloop