KVO in Swift

sanghee·2022년 5월 2일
0

🍀인턴 스터디

목록 보기
6/12

👀KVO(Key-Value Observing) in Swift

  • 키-값 관찰은 다른 객체의 속성의 변경에 대해 객체에 알리는 데 사용되는 패턴이다.
  • NSObject에서 상속된 클래스에만 키-값 관찰을 사용할 수 있다.

1. KVO를 위해 속성에 주석 달기

  • @objc 속성과 dynamic 수정자를 모두 사용하여 관찰하려는 속성을 표시한다.
class Observable: NSObject {

    @objc dynamic var value: Int

    init(_ value: Int) {
        self.value = value
    }

    func update(_ value: Int) {
        self.value = value
    }

}

2. 관찰자 정의

  • 관찰자 클래스의 인스턴스는 변경사항에 대한 정보를 관리한다.
  • 관찰하려는 속성을 참조하는 키 경로로 메서드를 호출하여 관찰을 시작한다.
  • 관찰 중인 속성에 대한 변경된 사항을 확인한다.
  • 속성이 어떻게 변경되었는지 알 필요가 없으면 매개변수 options을 생략한다.
class Observer: NSObject {

    @objc var observable: Observable
    var observation: NSKeyValueObservation?

    init(_ observable: Observable) {
        self.observable = observable
        super.init()

        observation = observe(\.observable.value, options: [.old, .new]) { object, change in
            print("\(change.oldValue!) -> \(change.newValue!)")
        }
    }

}

3. 관찰자를 관찰할 속성과 연결

  • 관찰할 대상을 생성한 후, 관찰자와 연결한다.
let observable = Observable(1)
let observer = Observer(observable)

변경에 반응하기

  • 관찰 대상은 속성이 변경되면 관찰자에게 알린다.
  • 변경이 감지되면 observation 내부 코드가 실행된다.
observable.update(3)

// 1 -> 3

관련 개념, 키워드

NSObject

  • 대부분의 Objective-C 클래스 계층 구조의 루트 클래스이다.
  • 자식클래스가 런타임 시스템에 대한 기본 인터페이스와 Objective-C 개체로 작동하는 기능을 상속한다.
  • 애플이 제공하는 대부분의 클래스들이 상속하고 있다.
  • 클래스에게 필요한 기본 인터페이스를 제공한다.
  • NSObject를 상속한 모든 클래스는 상속된 기능으로 런타임 시스템 기능을 고려하지 않아도 이용할 수 있다.
  • 루트 클래스가 같기에, 호환성 있는 프로그램을 계발할 수 있다.

NSKeyValueObservation

  • 개체의 지정된 속성에 대한 변경사항을 다른 개체에게 알리기 위해 채택하는 비공식 프로토콜이다.
  • 단순 속성, 일대일 관계, 대다 관계를 비롯한 모든 개체 속성을 관찰할 수 있다.
  • NSObject은 모든 객체에 대한 자동 관찰이 가능하게 하는 해당 프로토콜을 제공한다.
  • 변경 알림
    • observeValue: 관찰할 대상에 대해 지정된 키 경로 값이 변경되면 관찰하는 알린다.
  • 관찰 등록
    • addObserver: 관찰자 객체를 등록한다.
    • removeObserver: 관찰을 멈춘다.
  • 변경 사항 알림
    • willChangeValue, didChangeValue: 변경될 것이나 변경된 것임을 알린다.

@objc

  • Objective-C가 swift 코드를 접근할 수 있도록 한다.

dynamic

  • Objective-C와의 상호운용성 때문에 사용된다.
    • Objective-C는 클래스의 메소드나 프로퍼티를 호출할 때, 해당 객체에 메세지를 보내느 방식으로 구현되어 있다.
    • 런타임에 일어난다.
  • 선언 앞에 dynamic 키워드가 붙으면 objc 속성이 암시적으로 표시된다.
  • 클래스 멤버만 가능하다(값타임인 구조체와 열거형은 불가능).



참고문서

KVO in Swift

NSObject

NSKeyValueObserving

dynamic이란?

profile
👩‍💻

0개의 댓글