5

アプリケーションで CADisplayLink をタイマーとして使用しています。私のアプリはCADisplayLinkの精度/精度に大きく依存しているため、CADisplayLinkを使用しています。私の場合、NSTimerは適切な代替品ではありません。

問題は、アプリケーションがバックグラウンドにあるときに、CADisplayLink を起動してそのセレクターを呼び出す必要がある場合があることです。これは可能ですか?CADisplayLink がアプリケーション UI のリフレッシュ レートにリンクされていることを理解しています。これは、アプリがバックグラウンドにある場合、UI がないため、この場合 CADisplayLink を使用できないということですか? または、CADisplayLink を追加する実行ループを変更するか、引数を変更することで、CADisplayLink を使用することはできforModeますか? または、おそらくGCDのトリック/回避策を使用していますか?

注: 私のアプリは AudioPlayer を使用しているため、バックグラウンド機能を有効にしています。バックグラウンドで他のコードを実行できます。テストのために、CADisplayLink を NSTimer に切り替えたところ、NSTimer が起動し、必要に応じてセレクターを呼び出しました。CADisplayLink を起動させることができず、バックグラウンドで使用する可能性に関する決定的なドキュメントが見つかりません

表示リンクに関する現在のコードは次のとおりです。

func beginTimer(){

  dispatch_async(dispatch_get_main_queue()){
      self.displayLink = CADisplayLink(target: self, selector: "update")
      self.displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
  }
}

func update(){
  delegate?.executeCallback
 }
4

1 に答える 1

2

表示リンクのコールバックがバックグラウンドで呼び出されないことは、文書化されていない意味があります。とにかく描画するべきではないためです (実際、バックグラウンドで GPU 作業を行うと、アプリが強制終了されます)。

すでにオーディオとバックグラウンド モードを使用している場合は、remoteIO オーディオ ユニット* を使用してオーディオを実行し、画面の更新の代わりに出力サンプルをカウントすることで、タイミングを実装してみませんか?

このパスを使用すると、通常の 60Hz 画面リフレッシュと同等またはそれより小さい出力バッファー サイズを選択できます。

iOSがバッファサイズを変更することを選択する可能性がある低電力モード/他のアプリの相互作用には注意が必要ですが、同等の(そしておそらくより良い)タイミング精度を得ることができるはずです. いくつかの実験が必要になります。

AVAudioEngine*この手続き型出力に相当するものはまだないと思います。

于 2016-03-14T02:40:12.020 に答える