我正在为Mac做一个CLI工具,我的main看起来像这样:
int main(int argc, const char * argv[]){
@autoreleasepool {
//Some startup stuff here
[ServerPool sharedPool]; //Start the pool
/*
UI stuff for cli version
*/
while (1){
[[CLIUI sharedCLI] mainMenu];
[[CLIUI sharedCLI] menuInput];
}
}
return 0;
}在代码的另一部分中,我启动了一个NSTimer
progressUpdateTimer = [NSTimer timerWithTimeInterval:1.0
target:self
selector:@selector(updateProgress:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer: progressUpdateTimer forMode:NSDefaultRunLoopMode];但是,它从不触发选择器updateProgress:。我相信这是因为我没有在我的main中建立一个NSRunLoop,应该如何正确地解决这个问题?
发布于 2013-06-02 05:49:09
计时器和其他依赖于run循环的东西只有在run循环运行时才会触发。
在命令行程序中,理想的做法是使用dispatch_main()并将控制权交给GCD,或者在适当的模式下运行[NSThread currentRunLoop]一段适当的时间。
你必须去掉那个while(1),因为它会阻塞run循环。
concurrent programming documentation提供了大量关于如何使用run循环的文档。
如果您确实需要这个运行循环,可以将它移到第二个线程(主线程上的NSRunLoop更容易处理),然后在主线程上运行run循环。
您需要用一个NSRunLoop替换这个while(1)循环。这也可能意味着您需要将输入代码更改为从stdin读取的dispatch_source或NSFileHandle,等等……
也就是说,你将不得不对你的代码进行大量的重构。在google上搜索“在命令行程序中使用nsrunloop”,您可能会得到很多提示。此外,NSRunLoop文档还列举了一大堆示例。
这可能看起来令人望而生畏,但一旦你摸索到NSRunLoops,它们就是令人惊叹的强大的构造。
https://stackoverflow.com/questions/16877555
复制相似问题