每秒调用一个方法不起作用
Calling a method every second doesn't work
我正在尝试安排 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
为什么会这样,我该如何解决?
当您的线程正在休眠时,计时器不会 运行。
如果您在 ViewController 中使用计时器 class 代码,则它可以正常工作。
如果您想在 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
我正在尝试安排 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
为什么会这样,我该如何解决?
当您的线程正在休眠时,计时器不会 运行。
如果您在 ViewController 中使用计时器 class 代码,则它可以正常工作。
如果您想在 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