5

ビューの次のような裸のシングルビュー iOS アプリが-viewDidLoadあります。

dispatch_queue_t q_default;
q_default = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, q_default); //run event handler on the default global queue
dispatch_time_t now = dispatch_walltime(DISPATCH_TIME_NOW, 0);
dispatch_source_set_timer(timer, now, 30ull*NSEC_PER_SEC, 5000ull);
dispatch_source_set_event_handler(timer, ^{
    printf("test\n");
});
dispatch_resume(timer);

printf()これは、ドキュメントから直接取得されます (単純化された引数を除く)。ブロックは決して実行されません-誰かが理由を教えてもらえますか??

追加情報

私はこれをより大きなアプリで試していましたが、役に立ちませんでした。次に、ベアボーン アプリに戻り、ARC のオンとオフの両方を試し、このコードを で試しましたが-appDidFinishLaunching...、すべてうまくいきませんでした。このコードをNSLogs で囲むことができます。どちらも表示されます。確認しましたtimer-- そうではありませんnil

4

2 に答える 2

5

timerそれで、問題は、周囲のスコープが破壊されたときに参照を失ったことでした. timer自動変数の代わりにivarに変更すると、問題が修正されました...

于 2012-12-14T14:26:24.867 に答える
4

dispatch_source_createのドキュメントによると:

ディスパッチ元は保留状態で作成されます。ソースを作成し、必要な属性 (ハンドラーやコンテキストなど) を設定したら、アプリケーションは dispatch_resume を呼び出してイベント配信を開始する必要があります。

したがって、タイマーは中断されているため、起動しません。一時停止を終了するには、 dispatch_resumeを呼び出す必要があります。

于 2012-11-17T07:17:41.050 に答える