1

我编写了我的第一个 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布尔值更改时触发运行循环。

有什么建议么?

4

1 回答 1

3

您需要告诉运行循环从runMode:beforeDate:. 该类NSRunLoop没有定义消息来执行此操作,而是NSRunLoop构建在 上CFRunLoop,并且该CFRunLoopStop函数可以满足您的需要。

@implementation PIPieman

...

- (void)setFinished:(BOOL)finished {
    _finished = finished;
    CFRunLoopStop(CFRunLoopGetMain());
}
于 2012-09-06T02:45:37.150 回答