2011-01-21 21 views
4

作成から45秒後に起動するように設定されたタイマーをグローバルキューに作成していますが、なんらかの理由で起動できないようです。今度はそれを変えても何もしません。DISPATCH_SOURCE_TYPE_TIMERが起動しない

残りのアプリには多くのことが起こっているので、タイマーの発射に先立つものがある可能性があります。

これはタイマーが作成された方法です。

dispatch_queue_t globalQueue = 
     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); 

timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, globalQueue); 
if (timer) { 

// start 45 seconds for now 
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 45ull * NSEC_PER_SEC); 
uint64_t interval = 15ull * NSEC_PER_SEC; // every 15 seconds, converted to nanosecs 

// leeway:8 microseconds 
dispatch_source_set_timer(timer, startTime, interval, 8000ull); 

dispatch_source_set_event_handler(timer, block); // block is passed in 

dispatch_resume(timer); 

1)それは発射いない理由をデバッグ/フィギュアに試してみるための良い方法は何ですか?そうでない場合は、

2)特定の時点でキューで実行するようにスケジュールされているすべてのタスクをリストする方法はありますか?

アプリで行われた作業の一部をシミュレータで起動できないため、テストデバイス自体をデバッグする必要があります。

+0

優先度をDISPATCH_QUEUE_PRIORITY_NORMALに変更すると、それは起動しますか?また、ブロックがNULLでないことを確認していると仮定します。 –

+0

修正 - ブロックはNULLではなく、タイマーが起動する唯一の時間は、DISPATCH_QUEUE_PRIORITY_HIGHで構成されているときです。これは実行できません。だから私は低優先度のキューでブロックされているものを理解するためのツールがあるかどうか、またはすべてのコードをトレースする必要があるかどうかを判断しようとしています。 –

+0

最低優先度で実行するように設定できる項目の数に制限はありますか? –

答えて

1

定数は、符号なしlongでなく、符号なしlong longである必要があります。

dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 45ull * NSEC_PER_SEC); 
uint64_t interval = 15ull * NSEC_PER_SEC; // every 15 seconds, converted to nanosecs 
+0

申し訳ありません - それはタイプミスでした。それは実際のコードではullです。 –

2

私は同様の問題がありました。私の推測では、あなたのタイマーはローカル変数であり、設定した直後にリリースされます。あなたはそれをクラスのプロパティにすることができます。
hereをご覧ください。

関連する問題