首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTimer / NSRunLoop问题

NSTimer / NSRunLoop问题
EN

Stack Overflow用户
提问于 2013-06-02 05:43:42
回答 1查看 564关注 0票数 0

我正在为Mac做一个CLI工具,我的main看起来像这样:

代码语言:javascript
复制
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

代码语言:javascript
复制
progressUpdateTimer = [NSTimer timerWithTimeInterval:1.0
                                              target:self
                                            selector:@selector(updateProgress:)
                                            userInfo:nil
                                             repeats:YES];

[[NSRunLoop currentRunLoop] addTimer: progressUpdateTimer forMode:NSDefaultRunLoopMode];

但是,它从不触发选择器updateProgress:。我相信这是因为我没有在我的main中建立一个NSRunLoop,应该如何正确地解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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_sourceNSFileHandle,等等……

也就是说,你将不得不对你的代码进行大量的重构。在google上搜索“在命令行程序中使用nsrunloop”,您可能会得到很多提示。此外,NSRunLoop文档还列举了一大堆示例。

这可能看起来令人望而生畏,但一旦你摸索到NSRunLoops,它们就是令人惊叹的强大的构造。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16877555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档