操作观察期间的 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 致命错误的主要内容,如果未能解决你的问题,请参考以下文章