objective-c - 每秒调用一个方法不起作用
问题描述
我正在尝试安排一个 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 使用计时器类代码,则它可以正常工作。
如果您想在 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
推荐阅读
- mulesoft - Mulesoft 中的全局变量
- android - 使用模拟器的 Visual Studio 看不到 android avd 管理器?
- firebase - Firebase 数据库未更新值
- blazor - Blazor MatTable 页面大小更改
- angular - 角度 2+ 有没有办法强制检测变化?
- oracle - 如何 /as sysdba 到 Docker 上运行的数据库?
- java - 如何在 Java 中为断开连接的客户端杀死服务器中的线程
- php - 如何提交从 URL 检索表单并使用 PHP 提交?
- javascript - OnEdit - 不删除所有数据
- django - 如何修改路由器和视图集以进行模板渲染