web-dev-qa-db-ja.com

メインスレッドとバックグラウンドスレッドでのNSTimerのスケジュールの違いは?

メインスレッドでscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:を呼び出し、時間間隔を5秒に設定すると、タイマーの下のコードが実行され、5秒後にタイマーセレクターが呼び出されます。

しかし、いくつかのバックグラウンドスレッドで同じことを試みると、以下のコードscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:は実行されず、タイマーが起動するのを待って実行されます。もちろん、タイマーをバックグラウンドスレッドで実行するために、最初にNSRunLoopのインスタンスを取得して実行しました。

タイマーをバックグラウンドスレッドに設定して非ブロッキングにする方法はありますか?そのため、すぐに実行された後のコードは?

39
MegaManX

NSTimerはアクティブな実行ループを必要とします。メインスレッドで初期化すると、自動的にメイン実行ループが使用されます。バックグラウンドタイマーを作成する必要がある場合は、それをスレッドの実行ループに接続し、run()を呼び出してアクティブにします。

  1. NSTimerがイベントを実行するには、1つのライブNSRunLoopが必要です。メインスレッドでは、NSRunLoopは常にライブであり、アプリが終了するまで停止しませんが、他のスレッドでは、run()をアクティブにするには、NSRunLoopをアクティブにします。

  2. NSTimerは、invalidate()を呼び出して現在のタイマーを解放する必要があります。それ以外の場合は、タイマーはターゲットの現在のインスタンスの強い参照を保持し、invalidate()が呼び出されるか、アプリが終了するまでメモリに残ります。

  3. NSTimerは同じスレッドで作成および無効化する必要があり、多くの場合、それを忘れることがあります。

この例を見てください。参考になるかもしれません>> http://www.acttos.org/2016/08/NSTimer-and-GCD-Timer-in-iOS/ とドキュメント: https://developer.Apple.com/documentation/foundation/nstimer

6
Diksha235