gpt4 book ai didi

swift - 何时注销 KVO Operation isFinished 观察

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:42 24 4
gpt4 key购买 nike

在这个简单的代码 (Xcode 8.3) 中,我创建了一个 Operation 子类实例,注册了它的 isFinished 属性的 KVO 观察,并通过将它添加到我的队列来启动操作:

class MyOperation : Operation {
override func main() {
print("starting")
print("finishing")
}
}

class ViewController: UIViewController {
let q = OperationQueue()
override func viewDidLoad() {
super.viewDidLoad()
let op = MyOperation()
op.addObserver(self, forKeyPath: #keyPath(MyOperation.isFinished), options: [], context: nil)
self.q.addOperation(op)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("Observed \(keyPath)")
if let op = object as? Operation {
op.removeObserver(self, forKeyPath: #keyPath(MyOperation.isFinished))
}
}
}

如您所见,我有一个 observeValue(forKeyPath... 的实现,当然,我的计划是在那里调用 removeObserver(forKeyPath... .

问题是我的应用程序崩溃并显示“MyOperation 已解除分配,而键值观察者仍在其中注册”。我们打印“starting”和“finishing”,但我们从不打印“Observed”;该操作在我收到 KVO 通知之前不复存在。

这似乎是一个陷阱 22。如果我不能通过观察 isFinished 移除观察者,我应该什么时候做呢? [我可以通过将我自己的 KVO 可观察属性添加到 MyOperation 来解决这个问题,该属性是我在 main 末尾设置的。但是我必须这样做的想法很奇怪;这不就是为什么 isFinished 是可观察的,所以我可以在这里做我想做的事吗?]

最佳答案

Xcode 8.2 上测试完全相同的给定代码片段后,它正常工作,控制台显示:

starting
finishing
Observed Optional("isFinished")

问题的原因似乎是在 Xcode 8.3 上测试它,可能是一个错误 - 或者它可能是一个新行为 -。但是,我建议将其报告为错误。

关于swift - 何时注销 KVO Operation isFinished 观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43264341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com