본문의 내용은 Using Key-Value Observing in Swift을 번역한 내용입니다.
부족한 영어실력으로 번역하여 오역이 있을 수 있습니다.
Key-value observing 은 다른 오브젝트의 속성 변화를 오브젝트에게 알리기 위해 사용하는 Cocoa programming 패턴입니다. model과 view같이 논리적으로 분리된 부분 사이
에서 변경사항을 전달하는데 유용합니다. 또한 NSObject를 상속받은 클래스에서만 key-value observing를 사용할 수 있습니다.
@objc attribute
와 dynamic modifier
를 모두 사용하여 key-value observing을 통해 관찰하기를 원하는 속성을 표시하십시오. 아래의 예시는 관찰될 수 있는 myDate 속성을 지닌 MyObjectToObserve class를 정의합니다.
class MyObjectToObserve: NSObject {
@objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
func updateDate() {
myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
}
}
observer 클래스의 인스턴스는 하나 이상의 속성에 대한 변경사항에 대한 정보를 관리합니다. observer를 만들 때, 관찰하려는 속성을 나타내는 key path와 함께 observe(_:options:changeHandler:) method
를 호출하여 observation을 시작합니다. 아래의 예시에서 \.objectToObserve.myDate key path
는 MyObjectToObserve의 myDate속성을 참조합니다.
class MyObserver: NSObject {
@objc var objectToObserve: MyObjectToObserve
var observation: NSKeyValueObservation?
init(object: MyObjectToObserve) {
objectToObserve = object
super.init()
observation = observe(
\.objectToObserve.myDate,
options: [.old, .new]
) { object, change in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
}
}
}
NSKeyValueObservedChange 인스턴스의 oldValue와 newValue 속성을 이용하여 관찰 중인 속성에 대해 변경된 사항을 볼 수 있습니다. 만약 속성이 어떻게 변경되었는지 알 필요가 없다면, options 매개변수를 생략하십시오. options 매개변수를 생략하면 new와 old 속성값이 저장되지 않으므로, oldValue와 newValue 속성은 nil이 됩니다.
객체를 observer의 이니셜라이저에 전달하여 관찰하려는 속성을 관찰자와 연결합니다.
let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)
위에서 observed한 것 처럼 key-value observing을 사용하도록 설정된 객체는 그들의 observer들에게 속성 변경에대해 알립니다. 아래 예시는 updateDate 메소드 호출에 의해 myDate 속성이 변경됩니다. 이 메소드 호출은 observer의 change handler을 자동으로 트리거합니다.
observed.updateDate() // Triggers the observer's change handler.
// Prints "myDate changed from: 1970-01-01 00:00:00 +0000, updated to: 2038-01-19 03:14:08 +0000"
위의 예시는 날짜의 새 값과 이전 값을 모두 출력하여 속성 변경에 응답합니다.