このメッセージを送信するときに、保留中のすべての UI イベントの後にセレクターを実行するように指定する方法はありますか? すなわち。イベントキューで私のaterDelayタイマーの優先度を下げてください。
2 に答える
実際にperformSelector:withObject:afterDelay:
は、必ずしもメイン スレッドで発生する必要はありません。そのため、別の方法がありperformSelectorOnMainThread:withObject:waitUntilDone:
ます。のドキュメントはperformSelector:withObject:afterDelay:
言う
遅延の後、デフォルト モードを使用して、現在のスレッドでレシーバーのメソッドを呼び出します。
バックグラウンドでタスクを実行したい場合は+[NSThread detachNewThreadSelector:toTarget:withObject:]
、新しいスレッドを起動してタスクを実行し、UI をレスポンシブのままにする を調べることができます。別のスレッドを使用して実行時間の長いタスクを実行すると、UI がロックされてしまう可能性があるため、一般的には良い考えですが、複雑さが増します。スレッド化に慣れていない場合、意味のないバグに遭遇する可能性があります。
上記のコメントで、UI が応答しなくなるのはアニメーションに問題があると考えているとおっしゃいました。組み込みのアニメーション サポート (Core Animation または Cocoa ラッパーの 1 つ) を使用している場合、アニメーションによって UI が応答しなくなることはありません。一般に、応答しない UI は、実行ループがサービス UI イベントに戻る前に、プログラムがメイン スレッドで多くの作業を行っていることを意味します。
直接ではありません。performSelector:withObject:afterDelay:
セレクターを使用すると、メイン スレッドで実行されるため、定義上、現在の「保留中」の UI イベントがすべて実行された後に発生しますが、これはスクロールまたはアニメーションの途中である可能性があり、おそらく1 つの継続的なイベントですが、実際には何百もの個別のイベントです。
ただし、 を使用して同様のことを実現し、呼び出されるメソッドperformSelectorInBackground:withObject:
を呼び出すことができます[NSThread setThreadPriority:0.01]
。バックグラウンド スレッドを開いているため、UI 呼び出しを実行できないことに注意してください。ただし、これにより、メイン UI スレッドよりも優先度の低いバックグラウンド スレッドで作業を行うことができます。(独自のスレッドにあるため、自動解放プールを設定することを忘れないでください!)