首页 > 解决方案 > 每秒调用一个方法不起作用

问题描述

我正在尝试安排一个 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

为什么会这样,我该如何解决?

标签: objective-cgnustep

解决方案


当您的线程处于睡眠状态时,计时器不会运行。

如果您从 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


推荐阅读