1

このメッセージを送信するときに、保留中のすべての UI イベントの後にセレクターを実行するように指定する方法はありますか? すなわち。イベントキューで私のaterDelayタイマーの優先度を下げてください。

4

2 に答える 2

5

実際にperformSelector:withObject:afterDelay:は、必ずしもメイン スレッドで発生する必要はありません。そのため、別の方法がありperformSelectorOnMainThread:withObject:waitUntilDone:ます。のドキュメントはperformSelector:withObject:afterDelay:言う

遅延の後、デフォルト モードを使用して、現在のスレッドでレシーバーのメソッドを呼び出します。

バックグラウンドでタスクを実行したい場合は+[NSThread detachNewThreadSelector:toTarget:withObject:]、新しいスレッドを起動してタスクを実行し、UI をレスポンシブのままにする を調べることができます。別のスレッドを使用して実行時間の長いタスクを実行すると、UI がロックされてしまう可能性があるため、一般的には良い考えですが、複雑さが増します。スレッド化に慣れていない場合、意味のないバグに遭遇する可能性があります。

上記のコメントで、UI が応答しなくなるのはアニメーションに問題があると考えているとおっしゃいました。組み込みのアニメーション サポート (Core Animation または Cocoa ラッパーの 1 つ) を使用している場合、アニメーションによって UI が応答しなくなることはありません。一般に、応答しない UI は、実行ループがサービス UI イベントに戻る前に、プログラムがメイン スレッドで多くの作業を行っていることを意味します。

于 2009-05-16T04:24:45.533 に答える
0

直接ではありません。performSelector:withObject:afterDelay:セレクターを使用すると、メイン スレッドで実行されるため、定義上、現在の「保留中」の UI イベントがすべて実行された後に発生しますが、これはスクロールまたはアニメーションの途中である可能性があり、おそらく1 つの継続的なイベントですが、実際には何百もの個別のイベントです。

ただし、 を使用して同様のことを実現し、呼び出されるメソッドperformSelectorInBackground:withObject:を呼び出すことができます[NSThread setThreadPriority:0.01]。バックグラウンド スレッドを開いているため、UI 呼び出しを実行できないことに注意してください。ただし、これにより、メイン UI スレッドよりも優先度の低いバックグラウンド スレッドで作業を行うことができます。(独自のスレッドにあるため、自動解放プールを設定することを忘れないでください!)

于 2009-05-16T02:46:05.613 に答える