次の実行ループの繰り返しでblock
を実行できるようにします。次回の実行ループの最初または最後に実行されるかどうかは重要ではありません。現在の実行ループ内のすべてのコードが実行を終了するまで実行は延期されます。ブロックを次の実行ループ反復で実行するようにスケジュールするにはどうすればよいですか?
私は、次の実行ループでコードが実行される可能性がありますが、メインループがインターリーブされるため、以下のコードは動作しません。
私は上記と同じ問題を被ると信じて、次のdispatch_async(dispatch_get_main_queue(),^{
//my code
});
:
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void){
//my code
});
今、私は(場合私を修正して、現在の実行ループの最後に配置されるよう次はうまくいくと信じて私は間違っている)、これは実際に動作するだろうか?
[self performSelector:@selector(myMethod) withObject:nil afterDelay:0];
0
のタイマーはどうですか?ドキュメントは次のように述べています:If seconds is less than or equal to 0.0, this method chooses the nonnegative value of 0.1 milliseconds instead.
これは、次の実行ループ反復で実行を保証するものになりますか?私は考えることができるすべてのオプションをですが、私は、それは任意のものでないという保証付きで、次回の実行ループの反復で(メソッドの呼び出しではなく)ブロックを実行へのより近くまだだん
[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(myMethod) userInfo:nil repeats:NO];
より早く。
CFRunLoopの詳細を追加していただきありがとうございます。 – lal
これは、実行ループが行うことの素晴らしい要約です。 OPの質問については、 'CFRunLoopPerformBlock()'がブロックが実行ループの次のループで実行されることを確認する最も賢明な方法であると言いたいと思います。ブロックがループの途中で追加された場合、ブロックが実行されないことを明示的に述べていませんが、「このメソッドはブロックのみをエンキューし、指定された実行ループを自動的に起動させません。ブロックの実行は、次に実行ループが別の入力ソースを処理するために起動したときに発生します。オブザーバーのコールバックにブロックを追加することでチェックできます。 –