KVO(Key Value Observing) 의 동작방식

2023. 12. 2. 01:29Mobile/iOS

KVO 는 데이터를 바인딩해주는 방법 중 하나이다.

데이터 바인딩하니 SwiftUI에서 @State var data 즉각적으로 업데이트 해주고, Binding 은 State 에게 데이터를 연결받고 하위뷰에게 상태를 공유해주는 그런 역할을 했더랬다.

그럼 키와 값 관찰? 이라는 KVO 는 어떤 식으로 동작할까?

Key Value Observing 의 정의

다른 객체의 속성에 대한 변경사항을 객체에 알린다. 가만있어보자, 이걸보니 NotificationCenter(이것도 등록된 관찰자에게 정보를 알려주는 역할을 하는 NSObject 클래스) 가 생각나는구나!

 

다시 본론으로 돌아와 Key Value Observing(키-값 관찰)은 다른 개체의 속성 변경 사항을 객체에 알리는 데 사용하는 Cocoa Programming 패턴이라고 한다. 모델과 뷰 등을 논리적으로 분리된 앱 부분 간 변경사항을 전달하는 데 유용하다.

 

기본적인 사용 형태

@objc 속성과 dynamic modifier(동적 수정자) 를 모두 사용해 키-값 관찰을 통해 관찰하는 속성을 표시한다.

Observer 를 정의

관찰자 클래스의 인스턴스는 하나 이상의 속성에 대한 변경사항에 대한 정보를 관리한다. 관찰자를 생성할 때 관찰하려는 속성을 참조하는 키 경로를 사용해 `observe(_ : options: changeHandler: )` 메소드(함수)를 호출해 관찰을 시작한다.

아래 예에서 \. objectToObserve.myDate key path(키 경로) 는 MyObjectToObserve:myDate 속성을 참조한다.

class MyObserver: NSObject {
    @objc dynamic 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 속성을 사용하여 관찰 중인 속성에 대해 변경된 사항을 확인한다.\

 

Associate the Observer with the Property to Observe (관찰할 속성과 관찰자를 연결한다.)

객체를 관찰자의 이니셜라이저(초기생성자) 에 전달하여 관찰하려는 속성을 관찰자와 연결한다.

let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)

Respond to a Property Change (속성 변경에 응답)

위에서 관찰한 것과 같이 키-값 관찰을 사용하도록 설정된 객체는 Observer(관찰자에게) 속성 변경에 대해 알린다.