17

「iOS、私はこのメソッドをできるだけ早く実行したいのですが、この実行ループの繰り返しでは実行しないでください。次の実行ループでは実行しないでください。ありがとうございます。」

今、私はいつも次のようにしています:

[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];
[self doSomeOtherThings];

-doSomeOtherThings常に BEFORE が実行されることを 前提としています-doSomethingInNextRunLoop

ドキュメントには次のように記載されています。

遅延を 0 に指定しても、セレクターがすぐに実行されるとは限りません。セレクターは引き続きスレッドの実行ループでキューに入れられ、できるだけ早く実行されます。

したがって、基本的に、ダイレクトメッセージを送信したかのようにメソッドがすぐに呼び出され、-doSomethingInNextRunLoop前に実行される可能性があり-doSomeOtherThingsますか?

できるだけ早く呼び出されるようにするにはどうすればよいですか?しかし、この同じ実行ループの反復では決して呼び出されませんか?

言葉遣いを明確にするために: 実行ループとは、メイン スレッドと、スレッドが新しいイベントの準備が整うまですべてのメソッドが戻る必要がある反復を意味します。

4

4 に答える 4

10

Appleがいつか特別な場合に0の遅延を発生させるのではないかと心配している場合は、いつでも1e-37程度の遅延を指定できます。のドキュメントperformSelector:withObject:afterDelay:は簡単に読むことができますが、セレクターが常に次の実行ループの反復でスケジュールされることを保証します。

Appleがいつか特別な場合の遅延が任意の下限よりも小さくなるのではないかと心配している場合はperformSelector:target:argument:order:modes:、ドキュメントに具体的に記載されているNSRunLoopを使用して、実行ループの次の反復の実行をスケジュールすることができます。

于 2011-08-17T16:53:12.773 に答える
7

GCD (Grand Central Dispatch) を使用した非常に簡単な手順:

dispatch_async (dispatch_get_main_queue (), ^{
    NSLog (@"This stuff runs in the next iteration of the main run loop");
});
于 2014-03-18T12:06:26.667 に答える
1

ドキュメントを読んだあなたの結論は間違っていると思います。

したがって、基本的には、あたかもダイレクト メッセージを送信したかのように、メソッドがすぐに呼び出される可能性があります。

いいえ。引用したドキュメントの一部には、セレクターは常に実行ループでキューに入れられていると書かれています。したがって、ダイレクト メッセージとして実行されることはありません。

「必ずしもそうではない」という最初の文は少し誤解を招くかもしれませんが、2番目の文は、あなたが恐れていることは起こらないことを本当に明確にするべきだと思います.

于 2011-08-17T17:47:11.907 に答える
0

確かにこれを行うだけです。

[self doSomeOtherThings];
[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];

これにより、必要な実行順序が保証されます。

于 2011-08-17T16:50:34.187 に答える