しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

SwiftでKVOを試してみる

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を呼ぶ必要があります。