をisFinishedするとき、私はそのisFinished
財産のKVOの観察のために登録し、操作サブクラスのインスタンスを作成し、私のキューに追加して、操作を起動します。登録解除操作のKVOの観察は、この単純なコード(Xcodeの8.3)で
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が割り当て解除されました」とクラッシュすることです。 「開始」と「終了」を印刷しますが、「観測」は印刷しません。操作が存在しなくなるの前に私のKVO通知を取得します。
これはキャッチ22のようです。 isFinished
を観察してオブザーバーを削除できない場合、どうすればいいですか? [私はmain
の末尾に私自身のKVO観察可能なプロパティをMyOperationに追加することでこの問題を回避することができます。しかし、私がこれをしなければならないという考えは非常に奇妙です。これは私がここにしようとしているものを行うことができるようにisFinished
は、観測可能である正確な理由はないのですか?]
https://developer.apple.com/library/content/technotes/tn2109/_index.htmlに記載されている問題がありますか? - "同様の問題は、NSOperationのisFinishedプロパティを観察するためにキー値観測(KVO)を使用するときに発生します。KVOはオブザーバまたはオブザーバを保持しませんが、オブザーバを削除しても-viewWillDisappear:メソッドでは、KVO通知が既にオブジェクトの飛行中である可能性があります。その場合、通知を実行しているスレッドは、割り当て解除されたオブジェクトを呼び出すことになります。 –
@MartinRこのセクションでは、「自己」(オブザーバー)が存在しなくなる可能性があるという話をしているので、KVO通知は存在しないオブジェクトに送信される可能性があります。それは私の問題の_私の問題は、私のKVO通知を送らなくても操作(オブザーバ)が存在しなくなるということです。 'self'はルートビューコントローラであり、どこにも行きません。 – matt
私はそれを試したことに言及する有用性はありますか?「仕上げの観察開始オプション( "isFinished") '?私のアプリはクラッシュしない*。私はxcode 8.2を使用していますが、私はその事件を理解することを願っています... –