2016-08-08 8 views
0

NSTimerを使用して、x秒ごとにオーディオファイルを再生しています。オーディオファイルは常に実行中のプロセスと同期しているので、NSTimerの間隔は(私の知る限りでは)それができる最短です:バックグラウンドに移行するときにNSTimerが信頼できない

self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(updateTimerFired:) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:self.updateTimer forMode:NSRunLoopCommonModes]; 

私の問題は、例えば、バックグラウンド状態への移行時に発生しますユーザーがホームボタンをクリックしたとき。タイマーで待ち時間が発生し、トランジション中に「updateTimerFired:」メソッドが確実に呼び出されないようです。これにより、オーディオファイルの同期が外れて再生されますが、移行が完了すると最終的にバックアップが同期されます。私のアプリは、オーディオバックグラウンドモードを搭載していることに注意してください。

バックグラウンドに移行する際にレイテンシが発生しないようにNSTimer以外のツールがありますか? dispatch_source_createでNSTimerを交換することになった

+0

代わりにローカル通知を使用することを検討しましたか?私はそれを似たような問題のために使いましたが、私はレイテンシーの問題があることを覚えていません。そして、あなたはこのためのバックグラウンドタスクを使用していますか? – MCMatan

+0

@MCMatan私はバックグラウンドタスクを実装しようとしましたが、レイテンシはまだ発生しています。私は地元の通知を考慮していなかった。私はそれを調べて、彼らが私がしようとしているもののために働くかどうかを見ます。 – hgwhittle

+0

よろしくお願いします。ローカル通知があなたにうまく合っているかどうかを確認してください。また、バックグラウンドタスクのデルタ差を使ってNSTimerを作成していますか?同じタスクを使用していますか? – MCMatan

答えて

1

self.timerQueue = dispatch_queue_create("updateTimerQueue", nil); 
self.updateTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.timerQueue); 
dispatch_source_set_timer(self.updateTimer, DISPATCH_TIME_NOW, (1 * NSEC_PER_SEC)/50, (1 * NSEC_PER_SEC)/20); 

dispatch_source_set_event_handler(self.updateTimer, ^{ 
    [self updateTimerFired]; 
}); 
dispatch_resume(self.updateTimer); 

これは上の実行するためにタイマー用の専用キューを提供し、バックグラウンドへの移行によって中断されていません。

関連する問題