아리의 iOS 탐구생활

[iOS/Swift] KVO(Key-value observing) 본문

Swift/iOS

[iOS/Swift] KVO(Key-value observing)

Ari Lee 2021. 10. 20. 21:11
반응형

KVO는 A객체에서 B객체의 프로퍼티가 변화됨을 감지할 수 있는 패턴이다. Notification이 주로 Controller와 다른 객체 사이의 관계를 다룬다면 KVO는 객체와 객체 사이의 관계를 다루는데 적합하다. 메소드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에 반응하는 형태이다.

 

  • 객체의 프로퍼티의 변경사항을 다른 객체에 알리기 위해 사용하는 코코아 프로그래밍 패턴
  • Model과 View와 같이 논리적으로 분리된 파트간의 변경사항을 전달하는데 유용함
  • NSObject를 상속한 클래스에서만 KVO를 사용할 수 있다.

 

장점

  • 두 객체 사이의 정보를 맞춰주는 것이 쉽다
  • New / old value를 쉽게 얻을 수 있다.
  • KeyPath로 옵저빙하기 때문에 nested objects도 옵저빙이 가능하다.

단점

  • NSobject를 상속받는 객체에서만 사용이 가능하다.
  • dealloc될 때 옵저버를 지워줘야 한다.
  • 많은 value를 감지할 때는 많은 조건문이 필요하다.

Observing을 위한 Setup

class Person: NSObject {
    let name: String
    @objc dynamic var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
  1. age가 변경하는 걸 다른 객체에게 알리고 싶다면 위 예제처럼 NSObject 상속을 받아야한다.
    NSObject를 상속한 클래스에서만 KVO를 사용할 수 있기 때문이다.
    상속을 해야하므로 class에서만 사용가능하다.
  2. observe하려는 프로퍼티에 @objc attribute와 dynamic modifier를 추가해야한다.

Observer 정의

KeyPath를 사용하여 프로퍼티 KeyPath에 observer를 추가할 수 있다.

  • 관찰자 클래스의 인스턴스는 하나 이상의 속성에 대한 변경사항에 대한 정보를 관리한다.
  • 관찰자를 만들 때 관찰하려는 속성을 참조하는 키 경로로 메서드를 호출하여 관찰을 시작한다.
var person = Person(name: "ari", age: 20)

person.observe(\.age , options: [.old, .new]) { (object, change) in
    print("갑자기 \(object.name)의 나이(\(change.oldValue!))가 \(change.newValue!)살이 되어버렸다...")
}
person.age = 24 // 갑자기 ari의 나이(20)가 24살이 되어버렸다...
person.age = 27 //갑자기 ari의 나이(24)가 27살이 되어버렸다...

 

프로퍼티 옵저버와 다른점이 뭘까?

  • 프로퍼티 옵저버는 타입 정의 내부에 위치
    KVO는 타입 정의 외부에서 observer를 추가할 때 사용

 

Reference

 

Apple Developer Documentation

 

developer.apple.com

 

Apple Developer Documentation

 

developer.apple.com

 

Key-Value Observing(KVO) in Swift

안녕하세요 :) Zedd입니다. 오늘은 KVO에 대해서 공부! # KVO - Key-Value Observing의 약자 - 객체의 프로퍼티의 변경사항을 다른 객체에 알리기 위해 사용하는 코코아 프로그래밍 패턴 - Model과 View와 같

zeddios.tistory.com

 

Delegation, Notification, 그리고 KVO

언제, 어디서 써야할까?

medium.com

 

반응형
Comments