操作观察期间的 Swift 4 KVO 致命错误

Posted

技术标签:

【中文标题】操作观察期间的 Swift 4 KVO 致命错误【英文标题】:Swift 4 KVO fatal error during operations observing 【发布时间】:2018-01-16 19:09:55 【问题描述】:

我正在尝试在 Swift 4 中使用 KVO 观察 OperationQueue 操作计数,但在操作数组更改时出现致命错误。

以下代码在 Playground 中使用:

import Foundation

class MyObjectToObserve:NSObject 
    @objc dynamic var queue = OperationQueue()


class MyObserver:NSObject 

    @objc var objectToObserve: MyObjectToObserve
    var observation: NSKeyValueObservation?

    init(object: MyObjectToObserve) 
        objectToObserve = object
        super.init()

        observation = observe(\.objectToObserve.queue.operations.count)  object, change in
            print("Observed")
        
    


let myObjectToObserve = MyObjectToObserve()
let myObserver = MyObserver(object: myObjectToObserve)

myObjectToObserve.queue.addOperation 
    print("First operation")
    

这个错误:

致命错误:无法从 KeyPath 中提取字符串 Swift.KeyPath<__lldb_expr_6.myobserver swift.int>:文件 /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.74.1/src/swift/stdlib/public/SDK/Foundation/NSObject.swift, 第 85 行

据我了解,问题在于 OperationQueue 操作是 Swift 数组,而 KVO 无法使用它。我尝试使用带有整数的数组而不是 OperationQueue 并得到相同的错误。 如何在 Swift 4 中正确观察 OperationQueue 操作,或者当 OperationQueue 完成所有任务时是否有另一种方式来获取通知?

【问题讨论】:

【参考方案1】:

您无法观察到数组的count 属性。 You cannot observe any property of an array:

NSArray 对象不可观察,因此在NSArray 对象上调用此方法时会引发异常。

OperationQueue 有一个单独的 operationCount 属性供您观察。

    observation = observe(\.objectToObserve.queue.operationCount)  object, change in
        print("Observed")
    

【讨论】:

以上是关于操作观察期间的 Swift 4 KVO 致命错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中带有 Core Data 的 KVO 通知

KVO

依赖键路径的KVO对Swift类不起作用

UI进阶 KVO

将代码更新为最新的 Swift 4 语法会导致“线程 1:致命错误:索引超出范围”错误

Rx 键值观察KVO的使用