1

アプリケーションの起動時に長時間の操作を実行しています。モーダル NSWindow を使用して、操作中に進行状況バーとメッセージを表示しています。

私が達成したいのは、操作が実行されたときにウィンドウを自動的に閉じ、モーダル実行ループを終了して、プログラムの残りの部分を続行することです。ウィンドウコントローラーで3つの異なる方法を試しました:

方法 1:

- (void)windowDidLoad
{
    // self.op is an initialized NSOperationQueue set before this method is called
    [self.op addOperationWithBlock:^{
        [self performMigration]; // The method that does all the background work (works fine)
        [NSApp stopModal];
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [self close];
        }];
    }];
}

結果: マウスを動かす (または何らかの「イベント」を実行する) まで、ウィンドウは画面に表示されたままになり、その後は期待どおりに動作します。

方法 2:

- (void)windowDidLoad
{
    [self.op addOperationWithBlock:^{
        [self performMigration];
        [NSApp stopModal];
        [self close];
    }];
}

結果: ウィンドウは閉じますが、メインの実行ループはマウスを動かすまで続きません (上記のように)。

方法 3:

- (void)windowDidLoad
{
    // Get the thread of the modal loop
    self.callbackThread = [NSThread currentThread];
    [self.op addOperationWithBlock:^{
        [self performMigration];
        [self performSelector:@selector(callback) onThread:self.callbackThread withObject:nil waitUntilDone:NO];
    }];
}

- (void)callback
{
    [NSApp stopModal];
    [self close];
}

#2と同じ結果。イベント処理中 ([閉じる] ボタンを押すなど) にモーダル実行ループを停止したいと (これに一日中費やしたことに基づいて) 想定しています。

この一見単純なタスクを達成するために欠けている明らかなものはありますか? ありがとう!

4

0 に答える 0