web-dev-qa-db-ja.com

In Swift 4、ブロックベースのKVOオブザーバーを削除するにはどうすればよいですか?

このようなオブザーバーを保存する場合:

let observer: NSKeyValueObservation = foo.observe(\.value, options: [.new]) { (foo, change) in
    print(change.newValue)
}

不要になったらobserverを削除/無効化/クリーンアップするにはどうすればよいですか?

fooインスタンスには、removeインスタンスを受け取るNSKeyValueObservationのようなメソッドはありません。observerインスタンス自体にもremoveのようなメソッドはありません。

25
Guilherme

IOS 11では、その必要はありません。オブザーバーをスコープから外してください。オブザーバーを観察対象の前に死なせたり、観察対象をオブザーバーの前に死なせたりすることに対するペナルティはもうないので、あなたは実際に仕事をする必要はありません。

一方、本当にwantを使用してオブザーバーの登録を解除する場合は、オブザーバーを保持しているものから削除するか、invalidateに通知します。 (オブザーバーを永続化しないと、死ぬになり、オブザーバー関数が呼び出されないため、何かがそれを保持している必要があります。)

(「このようにオブザーバーを保存する場合」と言いますが、letを使用して保存する方法は、オブザーバーを保存するためのやや愚かな方法です。後で削除するか、少なくともvarに設定できるオプションのnilに保存します。)

29
matt