← Back to list

KVO(Key-Value-Oberservation)

NSObject를 상속받은 (class) 타입 내부에서 property를 관측할 때 사용하는 패턴입니다.

Zion · 2023-05-14 08:33 · 0 claps · 2.5 min read
#ios #kvo
Open on Medium ↗

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