본문 바로가기
iOS/Frameworks

Key-Value Observing 사용하기

by jalynneyoon 2021. 8. 25.

요즘 MVVM을 개인 프로젝트에 적용하다 보니 observable pattern을 익혀나가고 있습니다. 그러다 보니.. Key-Value Observing 방식이 어떻게 사용되는지 간단히 이해하고자 간단히 정리해보았습니다.

Key - Value Observing 이란?

Key-Value Observing(KVO)는 프로퍼티나 다른 객체의 변화를 객체에 알릴 수 있는 Cocoa programming pattern입니다. NSObject를 상속받은 클래스에서만 Key-Value Observing을 사용할 수 있습니다. 앞으로는 Key-Value Observing을 KVO로 부르겠습니다.

KVO를 사용하기 위해 프로퍼티에 Annotation 붙이기

KVO는 ObjectiveC의 런타임에 의존하기 때문에, @objc attribute와, dynamic modifier를 observe하고 싶은 프로퍼티에 붙여줍니다.

dynamic 은 옵젝씨 런타임에 동적 디스패치를 사용한다고 알려주는 modifier라고 합니다.

아래 예제는 myDate 프로퍼티가 observe될 수 있다는 것을 의미합니다.

class MyObjectToObserve: NSObject {    
  @objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970    

  func updateDate() {        
    myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.    
  }
}

Observer 정의하기

상태 변화를 나타낼 프로퍼티에 annotation을 붙였다면, 이를 관찰(observe)할 옵저버가 필요하겠죠?

옵저버 클래스의 인스턴스는 프로퍼티에서의 변화에 관한 정보를 관리합니다. observer를 만들면, 관찰하고 싶은 프로퍼티의 key path를 사용해 observe(_:options:changeHandler:) 메소드를 호출함으로써 observation을 수행할 수 있습니다.

아래 예제에서는 \.objectToObserve.myDate key path는 MyObjectToObservemyDate 프로퍼티를 언급하고 있습니다.

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!)")
    }
  }}

option 파라미터는 프로퍼티의 값을 전달할 수 있습니다. 그래서 만일 상태가 변하는 것만 알고 싶고 프로퍼티의 값이 궁금하지 않다면 생략할 수 있습니다.

옵저버와 프로퍼티 연동하기

그 다음에는 만들어둔 옵저버와 프로퍼티를 연동해야 합니다. 아래와 같이 옵저버의 initializer의 object 에 관찰하려는 값을 넣어주어 연동할 수 있습니다.

let observed = MyObjectToObserve() // observe하려는 프로퍼티가 있는 클래스 
let observer = MyObserver(object: observed)

이렇게 아주 간단하게 KVO을 iOS에서 사용하는 방법을 정리해보았는데요, 다음번에는 Combine과 함께 사용하는 KVO방식을 한번 정리해보도록 하겠습니다. 이만 총총..

References

댓글