KVO는 오브젝트의 프로퍼티의 변경을 다른 오브젝트에 노티해주는 코코아 프로그래밍 페턴이다.

모델과 뷰간의 커뮤니케이션에 유용하다. NSObject를 상속한 클래스에서만 사용이 가능하다.

언노테이션을 통해 프로퍼티에 KVO적용이 가능함.

class MyObjectToObserve : NSObject{

	@objc dynamic var myDate = NSDate(timeINtervalSince1970 : 0)
	func updateDate(){
		myDate = myDate.addingTimeInterval(Double(2<<30))
	}
}

nsobject를 상속해야하고 @objc dymaic 언노테이션으로 프로퍼티에 설정해주어야함.

옵저버 정의하기

옵저버 클레스 인스턴스는 하나이상의 프로퍼티의 변화를 관리한다. 너가 observation을 하기위해서는

observe(_:options:changehandeler:) 를 사용해야 함. key path 참조를 너가 원하는 프로퍼티에 걸어 주어야 함. 애플 공식 예제에서 \.objectToObserve.myDate 가 MyObjectToOberve의 myDate프로퍼티를 관찰하기 위한 key path refers임.

class MyObserver: NSObject {
    @objc var objectToObserve: MyObjectToObserve
    var observation: NSKeyValueObservation?

    init(object: MyObjectToObserve) {
        objectToObserve = object
        super.init()
//        print(\\.objectToObserve.myDate)
        observation = observe(
            \\.objectToObserve.myDate,//관찰할 프로퍼티 keyPath -> 이래서 keyvalue Observing인듯
            options: [.old, .new]//관찰 옵션
        ) { object, change in
            print("myDate changed from: \\(change.oldValue!), updated to: \\(change.newValue!)")
        }
    }
}
let myObservable = MyObjectToObserve()
let myObserver = MyObserver(object: myObservable)
myObservable.updateDate()

옵션파라메터를 설정하지 않는다면 change.oldvalue, change.newvalue 는 nil로 설정됨.