8

これは正しい方法はありますか? NSTimerドキュメントは、これは言う:GCDシリアルキューのNSTimersをスケジュールして無効にするのは安全ですか?

特別な考慮事項

あなたは、タイマーがインストールされた 上のスレッドからこのメッセージを送信する必要があります。別の スレッドからこのメッセージを送信すると、タイマーに関連付けられた入力ソースが実行ループから削除されないため、 スレッドが正しく終了しない可能性があります。

GCDシリアルキューが常に同じスレッドでブロックを実行することを保証するものではありませんので、あなたが同じスレッドでNSTimerをスケジュールし、無効にすることを確保するための正しい方法は何ですか?

EDIT:以下の答えのアドバイスに従い

、私はどのキューから使用することができますGCDを使用してカスタムタイマーの実装ですMSWeakTimerhttps://github.com/mindsnacks/MSWeakTimer)を作成しました。

+0

+1 MSWeakTimer ...私たちのひどい記憶の問題を解決しました! – jowie

答えて

9

GCDによって管理される匿名ワーカースレッドにNSTimerをインストールしないでください。

NSTimerではなく、GCDでディスパッチタイマーソースを使用します。 dispatch_source_create(3)。

NSTimerは、現在のスレッドのrunloopに依存していますが、これはGCDキューには意味がありません。 GCDおよびrunloop APIの詳細については、WWDC2012 GCDセッションを参照してください。

+0

それはたくさんの意味があります。私は唯一の例外はメインキューになると思います、そうですか? –

+0

が正しい場合、プロセスがdispatch_main(3)を呼び出さない限り、メインのrunloopとメインのキューは結びつき、メインスレッドで実行されることが保証されます。 – das

+1

https://github.com/mindsnacks/MSWeakTimer –

関連する問題