我编写了我的第一个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
布尔值的更改时触发运行循环。
有什么建议吗?
答案 0 :(得分:3)
您需要告诉运行循环从runMode:beforeDate:
返回。 NSRunLoop
类没有定义要执行此操作的消息,但NSRunLoop
构建在CFRunLoop
上,CFRunLoopStop
函数可以满足您的需求。
@implementation PIPieman
...
- (void)setFinished:(BOOL)finished {
_finished = finished;
CFRunLoopStop(CFRunLoopGetMain());
}