KVOとは
KVOとはKey-Value Observingの略で、プロパティーの値の変化を通知してくれる仕組みです。
KVOを使ってみる
KVOは下のように利用します。
監視したいオブジェクトのaddObserver
メソッドを呼び出す事で監視できます。
その際には監視するオブジェクトと監視するプロパティー名を渡す必要があります。
今回は監視するオブジェクトはself
でプロパティーはvalue
にしました。
実際に値を変更すると監視するオブジェクトのobserveValueForKeyPath
メソッドが呼ばれます。
keyPath
にプロパティー名、change
には変更情報が入っています。
change
の中身ですが、addObserver
に.New
を渡していれば変更後の値・.Old
を渡せば変更前の値が入ります。
class ViewController: UIViewController { let myClass = MyClass() override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) myClass.addObserver(self, forKeyPath: "value", options: [.New, .Old], context: nil) myClass.value = "NewValue" } override func viewWillDisappear(animated: Bool) { myClass.removeObserver(self, forKeyPath: "value") } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { NSLog("Called") } } class MyClass: NSObject { dynamic var value = "" }
扱う際の注意点ですが、KVOはNSObject
に実装があるので、監視対象・監視するオブジェクトの両方ともNSObject
を継承する必要があります。
それとプロパティーにdynamic
を付けないとobserveValueForKeyPath
が呼ばれないのでその点も注意する必要があります。
そして監視するオブジェクトが破棄される際は必ずremoveObserver
を呼ぶ必要があります。