1

プログラムを開始すると、2 番目のスレッドを起動してバックグラウンド作業を行います。このスレッドは死ぬことはありませんが、メイン スレッドの続行を許可する前に、実行中の処理が完了するまで待つ必要があります。

2 番目のスレッドがステータスを更新するのを待っている間に、メイン スレッドをブロックして再開するにはどうすればよいですか?

4

1 に答える 1

7

まず、メインスレッドをブロックしないでください。決して。iOS で十分な時間メイン スレッドをブロックすると、アプリが強制終了されます。OS X では、レインボー ピザ オブ デスが表示されます。

最終的に、メイン スレッドをブロックすると、アプリが応答しなくなります。

代わりに、モーダル ダイアログ、モーダル シート、または進行を続ける前にアプリが実行しなければならない何かを実行中であることを示すその他のステータス インジケーターをアプリケーションに表示させます。ユーザーが「ああ、くそっ! 時間がない! 中止! 中止! 中止!」と判断した場合に備えて、「終了」メニュー項目がまだ有効になっていることを確認してください。

次に、バックグラウンド スレッドが完了したら、さまざまなメカニズムのいずれかを使用してメイン スレッド (GCD、performSelector:... など) にディスパッチし、「初期化」モダリティを取り除きます。

ポーリング、スリープ、または while(){} はまったく必要ありません。


私のバックグラウンド スレッドは完了していません。多かれ少なかれ永遠に存続します。そして、メインスレッドがそれを行う前に、特定の状態に到達する必要があります。

丁度; したがって、その状態に達したら、次を使用できます。

 [someObject performSelectorOnMainThread:@selector(sshConnectionEstablished:) withObject:nil];

アプリケーションデリゲートはどこsomeObjectにある可能性がありますか。

または、通知を使用して次のようなことを行うこともできます。

 dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationNamed:@"MySSHConnectionEstablished" ....];
 });

非同期にするか同期にするかはあなた次第です。

于 2013-03-21T03:58:04.180 に答える