【发布时间】:2020-07-16 15:36:56
【问题描述】:
我正在围绕 AVPlayer 编写Combine wrappers。考虑以下示例(提供完整源代码here):
private final class PlayerRateSubscription<S: Subscriber>: Subscription where S.Input == Float {
// ...
private var stateObserverToken: NSKeyValueObservation? = nil
// ...
func request(_ demand: Subscribers.Demand) {
// ...
stateObserverToken = player.observe(\.rate) { [weak self] (player, change) in
print(change.oldValue)
print(change.newValue)
print(player.rate)
// ...
}
}
// ...
}
当我运行该代码时,change.oldValue 和 change.newValue 最终都为零。但是,player.rate 将始终返回正确的汇率。
我在观察playback status 时遇到了同样的情况:playerItem.status 返回正确的值,而来自 KVO 更改的值始终为零。我觉得我应该能够从change 变量中获取旧值/新值。
我是否在滥用 API?这是 AVFoundation 中的已知限制吗?
更新
经过一番研究,我在documentation 中发现了以下内容:
省略 options 参数会放弃存储新旧属性值,这会导致 oldValue 和 newValue 属性为 nil。
将我的实现更新为:
observationToken = observedObject.observe(keyPath, options: [.old, .new]) { [weak self] (object, change) in
...
}
一些观察到的关键路径开始正常工作。
不幸的是,不是全部:根据docs,AVPlayerItem.status 应该是键值可观察的,但change.oldValue 和change.newValue 都是 nil,我觉得这完全令人费解。
【问题讨论】:
标签: ios swift avfoundation avplayer key-value-observing