KVO는 오브젝트의 프로퍼티의 변경을 다른 오브젝트에 노티해주는 코코아 프로그래밍 페턴이다.
모델과 뷰간의 커뮤니케이션에 유용하다. NSObject를 상속한 클래스에서만 사용이 가능하다.
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로 설정됨.