OS X main.m运行服务器样式程序

时间:2012-09-06 02:20:58

标签: macos nsrunloop

我编写了我的第一个OS X命令行程序,这是一个服务器风格的程序。它的工作是处理各种信息并回应其他事件。

我在main.m中有以下代码

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        PIPieman *pieman = [[[PIPieman alloc] init] autorelease];
        [pieman start];

        NSRunLoop *loop = [NSRunLoop currentRunLoop];
        while (!pieman.finished && [loop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

    }
    return 0;
}

我从各种文档中获取了此代码,基本思路是,一旦pieman.finished设置为YES,程序就会退出。

我遇到的问题是该标志是由pieman中的代码设置的,但是没有触发运行循环,因此程序不会退出。我一直在寻找触发运行循环的方法,似乎有各种各样,但没有一种感觉像是一个很好的解决方案。例如,我可以将beforeDate:减少到几秒钟,以定期触发运行循环。

我的偏好是在finished布尔值的更改时触发运行循环。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您需要告诉运行循环从runMode:beforeDate:返回。 NSRunLoop类没有定义要执行此操作的消息,但NSRunLoop构建在CFRunLoop上,CFRunLoopStop函数可以满足您的需求。

@implementation PIPieman

...

- (void)setFinished:(BOOL)finished {
    _finished = finished;
    CFRunLoopStop(CFRunLoopGetMain());
}