9

NSURLConnection を使用して非同期 Web 要求を利用するアプリケーションをプログラミングしているため、複数のスレッドが実行されています。アプリのメイン ロジックが 1 つのスレッドで実行されるようにするために、performSelectorOnMainThread:waitUntilDone:. ただし、これをメイン スレッドで実行していることもあり、好奇心をそそられます。

performSelectorOnMainThread:waitUntilDone:メインスレッドで呼び出された場合は? ただと同じように動作しperformSelector:ますか?waitUntilDone:だとしたらYES?もしそうならNO

waitUntilDone:編集: isの場合、セレクターは (ほぼ) すぐに実行されることがわかりましたが、 isの場合にいつYES実行されるかわかりません。waitUntilDone:NO

4

3 に答える 3

2
If the current thread is also the main thread, and you pass YES,
the message is performed immediately, otherwise the perform is
queued to run the next time through the run loop.

YES の場合、performSelectorOnMainThread:withObject:waitUntilDone:返却前に実行できます。

waitUntilDone: が YES の場合、セレクターは (ほぼ) すぐに実行されますが、waitUntilDone: が NO の場合はいつ実行されるかわかりません。

実行ループについて: メイン スレッドには実行ループがあります。これにより、多かれ少なかれスレッドの終了が妨げられます。実行ループは、todo リストを管理します。作業が完了すると、そのスレッドの実行をしばらく中断します。その後、後で目を覚まし、やるべき仕事があるかどうかを確認します。

作業量は大きく変わる可能性があります (たとえば、起動してからセレクターが実行されるまでの間に、非常に重い描画やファイル I/O を実行する場合があります。したがって、正確なタイミングを得るには適したツールではありませんが、それがどのように機能し、実装がどのように作業を実行ループに追加するかを知るには十分です。

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

于 2013-07-12T06:26:36.820 に答える
1

waitUntilDone: が YES の場合、即時関数呼び出しとして機能します。

waitUntilDone: が NO の場合、他のすべてのスレッドの呼び出しとともに呼び出しをキューに入れます。

このメソッドは、共通の実行ループ モード (NSRunLoopCommonModes 定数に関連付けられたモード) を使用して、メイン スレッドの実行ループでメッセージをキューに入れます。通常の実行ループ処理の一部として、メイン スレッドはメッセージをデキューし (一般的な実行ループ モードの 1 つで実行されていると仮定)、目的のメソッドを呼び出します。

前述のように、描画や I/O などは、キュー内の何よりも優先されます。メイン スレッドが次のイベント ループでキュー サービスの時間を持つようになると、他にもいくつかの詳細があり、先入れ先出しでカウントするほど単純ではありません。

1) dispatch_async() ブロックはモードを無視します。

2) 特定のモード引数 (イベント追跡など) を持つ performSelector バリアントは、その特定のモードで実行されるループで、デフォルトの共通モード引数を持つものよりも優先される場合があります。

原則として、予測可能なタイミング動作が必要な場合は、実行ループ モードなどの高レベルの考慮事項を考慮しない低レベルの GCD ディスパッチ関数を使用する必要があります。

于 2013-07-12T13:00:25.010 に答える