web-dev-qa-db-fra.com

Dans Swift 4, comment supprimer un observateur KVO basé sur des blocs?

Si je stocke un observateur comme celui-ci:

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

Comment puis-je supprimer/désactiver/nettoyer observer une fois que je n'en ai plus besoin?

Mon instance foo n'a pas de méthode semblable à remove qui reçoit une instance NSKeyValueObservation, la observer elle-même n'a pas de remove comme comme.

25
Guilherme

Dans iOS 11, vous n'êtes pas obligé. Laissez simplement l'observateur sortir du cadre. Il n'y a plus de pénalité pour laisser un observateur mourir avant l'observé ou pour laisser l'observé mourir avant l'observateur, vous n'avez donc aucun travail à faire.

D'un autre côté, si vous vraiment voulez pour désinscrire l'observateur, supprimez-le de tout ce qui le retient ou dites-le à invalidate. (Quelque chose doit le retenir, car si vous ne persistez pas, l'observateur, il mourra et votre fonction d'observateur ne sera jamais appelée.)

(Vous dites "si je stocke un observateur comme celui-ci", mais la façon dont vous le stockez, avec let, est une façon quelque peu idiote de stocker l'observateur. Il serait préférable de le mettre dans un ensemble à partir de que vous pouvez supprimer plus tard, ou au moins le stocker dans un var facultatif que vous pouvez ensuite définir sur nil.)

29
matt