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.finishedYES に設定すると、プログラムが終了するということです。

私が抱えている問題は、パイマン内のコードによってフラグが設定されているが、実行ループがトリガーされていないため、プログラムが終了しないことです。実行ループをトリガーする方法を探していましたが、さまざまな方法があるようですが、良い解決策とは思えません。たとえば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 に答える