在观察

时间:2018-01-16 19:09:55

标签: swift key-value-observing nsoperationqueue

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

以下代码用于游乐场:

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>:file   /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 个答案:

答案 0 :(得分:1)

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

  

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

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

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