KVO(Key-Value-Oberservation)
NSObject를 상속받은 (class) 타입 내부에서 property를 관측할 때 사용하는 패턴입니다.
KVO(Key-Value-Oberservation)
- NSObject를 상속받은 (class) 타입 내부에서 property를 관측할 때 사용하는 패턴입니다.
- 관측하고 있는 property가 값의 변화를 가질 때 마다 그에 따른 대응을 할 수 있습니다.
- NSObject를 상속받은 타입에서만 가능한 이유는 NSObject가 NSKeyValueObservation protocol을 채택하고 있기 때문입니다.
- 다른 3rd_party나 라이브러리의 도움을 받지 않고 데이터 바인딩을 하는데 사용할 수 있다는데 의미가 있습니다.
- objective-c를 활용한 부분이 많으므로 옛날 문법식 표현에 주의해야합니다.
- 관측되는 property는 @objc와 dynamic 키워드가 붙어야 합니다. objective-c와의 상호작용 및 message dispatch의 사용을 위해.
class ObservedType: NSObject {
@objc dynamic var number: Int = 0
// 위의 키워드가 사용된 것은 Objc와의 상호작용과 message dispatch를 사용하기 위함이다.
}
class Observer {
let observed = ObservedType()
var observingNumber: NSKeyValueObservation? = nil
var observingString: NSKeyValueObservation? = nil
init() {
observingNumber = observed.observe(\\ObservedType.number, options: [.new, .old]) { d, change in
// "\\"의 사용은 "\\"은 주로 클래스, 구조체, 튜플 앞에 붙어서 해당 타입에 속상 정보에 접근하기 위한 keyPath로 사용되어집니다.
// 이번 예시에서는 ObservedType의 number프로퍼티에 접근하기위한 keyPath를 부여하기 위해 "\\"가 사용되었습니다.
if let old = change.oldValue {
print("oldValue : \\(old) -> newValue: \\(d.number) updated!!!")
} else {
print("Changed Not Yet")
}
}
}
func changeValue(_ n: Int) {
self.observed.number = n
}
}
let d = Observer()
d.changeValue(10)
위의 예시는 ObservedType의 number 프로퍼티를 관측하여 값의 변경 될 때마다 변경을 처리하는 클로저가 실행되는 것을 확인할 수 있는 예시입니다.
Observer 타입이 생성될 때 init에서 이미 생성된 ObservedType의 number 프로퍼티에 대한 관측을 등록했고 changeValue()가 호출 될 때 number 값이 변경함에 따라 observingNumber의 내부 클로저가 호출되어 변경에 대응하는 것을 확인할 수 있습니다.
메타데이터
- post_id
- 8a6bf4dfc920
- slug
- kvo-key-value-oberservation-8a6bf4dfc920
- url
- https://medium.com/@LeeZion94/kvo-key-value-oberservation-8a6bf4dfc920
- canonical_url
- https://medium.com/@LeeZion94/kvo-key-value-oberservation-8a6bf4dfc920
- author_url
- https://medium.com/@LeeZion94
- status
- ok
- fetched_at
- 2026-06-29 01:02:39