開発環境
- XCode9
- Swift4
- iOS11
AVPlayerを利用する際にUISliderを再生時間に合わせて動かすというよくあるやつですが、addPeriodicTimeObserverを使いますが、非同期処理を行うので、弱参照を意識しないと駄目なようです。
timeObserverToken = appDelegate.player?.addPeriodicTimeObserver(forInterval: time, queue: nil) { [weak self] (time) in
guard let `self` = self else {
return
}
// slider の位置更新
// label の再生時間更新
}
addPeriodicTimeObserverを使う場合はremoveTimeObserverも呼び出すようにしないとずっと非同期処理が走るみたいですので、再生が終わったらremoveTimeObserverを呼び出します。
if let _timeObserverToken = timeObserverToken {
appDelegate.player?.removeTimeObserver(_timeObserverToken)
self.timeObserverToken = nil
}
参考サイト
addPeriodicTimeObserver(forInterval:queue:using:)
Appleの公式で弱参照にしろよって解説があった。ついでにqueueにnilをすると、dispatch_get_main_queue()を使うようです。
AVFoundationPiPPlayer
addPeriodicTimeObserverを使ったアプリのAppleのサンプル
Swiftの"[weak self]"にアクセスする時に"if let weakSelf = self"とか"self?"を書きたくない人へ
すごく参考になりました。self?の?が無くなるのでロジック的にもソース的にも楽。