본문 바로가기

iOS/Swift

[Swift] Key-Value Observing (KVO) 란

Key-Value Observing (KVO)  이란

 

KVO(Key-Value Observing)는 객체의 속성(property)이 변경될 때 이를 자동으로 감지하고 반응할 수 있는 메커니즘입니다. 

만약 어떠한 객체에 'name' 란 속성이 변경이 되었을때 이를 자동으로 감지하고 싶을때 KVO를 사용하여 해당 변경 사항을 모니터링할 수 있습니다.

 

class Person: NSObject {
    @objc dynamic var name: String = ""
}

class NameObserver: NSObject {
    var person: Person

    init(person: Person) {
        self.person = person
        super.init()
        // KVO를 사용하여 name 속성의 변화를 감지함
        person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "name" {
            if let newName = change?[.newKey] as? String {
                print("이름이 \(newName)으로 변경되었습니다.")
            }
        }
    }

    deinit {
        person.removeObserver(self, forKeyPath: "name")
    }
}

let person = Person()
let observer = NameObserver(person: person)

person.name = "Alice"
// 출력: 이름이 Alice으로 변경되었습니다.

 

관찰자가 되는 객체는 addObserver(_:forKeyPath:options:context:) 메서드를 사용하여, 어떤 객체의 어떤 속성을 관찰할지를 지정합니다.

 

속성의 값이 변경되면 observeValue(forKeyPath:of:change:context:) 메서드가 호출되어, 해당 변경 사항에 대해 필요한 처리를 할 수 있습니다.

 

왜 사용해야할까 or 나만의 고민

KVO를 통해 객체의 상태 변화비동기적으로 감지가 가능합니다. 이를 이용하여 UI 요소가 이 데이터 모델에 의존할 때 변화를 실시간으로 UI에 반영이 가능합니다.

 

Objective-C와의 호환성이 필요한 경우 사용 SwiftUI에서는 ObservedObject를 통해 객체의 상태 변화를 관찰합니다.