【问题标题】:AVPlayer values observed via NSKeyValueObservation are always nil通过 NSKeyValueObservation 观察到的 AVPlayer 值始终为零
【发布时间】: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.oldValuechange.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
    ...
}

一些观察到的关键路径开始正常工作。

不幸的是,不是全部:根据docsAVPlayerItem.status 应该是键值可观察的,但change.oldValuechange.newValue 都是 nil,我觉得这完全令人费解。

【问题讨论】:

    标签: ios swift avfoundation avplayer key-value-observing


    【解决方案1】:

    默认情况下,并非所有属性都是键值可观察的。

    例如在status的文档中有

    这个属性是使用键值观察可以观察到的键值。

    rate 中缺少此行

    【讨论】:

    • 我在观察playerItemstatus 属性(这是可观察的键值对)时也遇到了同样的行为,所以我不确定就是这样。有趣的是,KVO 回调被触发,但 change 对象中缺少这些值。
    【解决方案2】:

    万一其他人正在寻找这个,这是一个错误。 https://bugs.swift.org/browse/SR-5872

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多