iOS/iOS

KVO [ Key Value Observing ]

황민우 2022. 3. 14. 21:41

정의

- A객체에서 B객체의 키의 값이 변화됨을 감지할 수 있는 패턴입니다.
- 객체의 프로퍼티의 변경사항을 다른 객체에 알리기 위해 사용하는 프로그래밍 패턴입니다.
- 객체와 객체 사이의 관계를 다룰 때 적합합니다.
- 메서드나 다른 액션에서 나타나는 것이 아닌, 프로퍼티의 상태에서 반응하는 형태입니다.


예제

- NSObject를 상속받은 SomeClass 클래스 정의합니다.

- value라는 프로퍼티 앞에 dynamic키워드 사용해 dynamic dispatch를 활성화시킵니다.

- 옵저버를 넣기 위한 observe( ) 메서드를 사용합니다.

- 해당 오브젝트에서 키패스로 지정된 프로퍼티의 값이 바뀌면 클로져가 호출됩니다.

- observe( ) 명령으로 someObject의 value 프로퍼티의 값 변화를 감지하며, observe 안에 print문이 출력됩니다.

class SomeClass: NSObject {
  @objc dynamic var value: String = ""
}

let someObject = SomeClass()

someObject.observe(\.value) { (object, change) in
  print("SomeClass object value changed to \(object.value)")
}

someObject.value = "test"  // TEST

동작 방식

변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법입니다.
- Property observers와 아주 유사하지만 KVO는 타입 정의 밖에서 observe를 추가한다는 점이 다릅니다.
- NSObject를 상속받기 위해 @objc를 반드시 붙여줘야 합니다.
- 특히 KVO 패턴은 속성 각각에 @objc dynamic 키워드를 붙여줘야 합니다.


장점

  1. 두 객체 간 동기화 가능, (Model과 View와 같이 논리적으로 분리된 파트 간의 변경사항을 전달하여 동기화가 가능)
  2. 객체의 구현을 변경하지 않고 내부 객체의 상태 변화에 대응할 수 있음
  3. 관찰된 프로퍼티의 이전 값(oldValue)과 최신 값(newValue)을 제공
  4. 따로 옵저버를 해제하지 않아도, 시스템이 알아서 옵저버를 제거해줌(removeObserver)
  5. KeyPath를 사용하여 프로퍼티를 관찰하므로, nested 프로퍼티도 관찰 가능

- 다음 코드는 5번에 해당하는 내용으로 person 인스턴스에서 \.address.town 이런 형식으로 관찰도 가능하다는 의미.

class Address: NSObject {
	@objc dynamic var town: String
    
    init(town: String) {
    self.town = town 
    } 
} 

class Person: NSObject {
	@objc dynamic var address: Address
    
    init(address: Address) {
    self.address = address 
    }
}

출처: https://zeddios.tistory.com/1220 [ZeddiOS]

 

 


단점

  1. NSObject 상속해야 함(Objective-C 런타임에 의존하게 됨)
  2. NSObject를 상속받는 객체에서만 사용이 가능
  3. 많은 value를 감지할 때는 많은 조건문이 필요
  4. dealloc(할당 해제)될 때 옵저버를 지워줘야 합니다.

내용 출처

https://zeddios.tistory.com/1220

 

Key-Value Observing(KVO) in Swift

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

zeddios.tistory.com

https://velog.io/@hayeon/KVO-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%98%EC%8B%9C%EC%98%A4

 

KVO 동작 방식에 대해 설명하시오.

KVO KVO는 A객체에서 B객체의 키의 값이 변화됨을 감지할 수 있는 패턴입니다. 위의 두 패턴이 주로 Controller와 다른 객체 사이의 관계를 다룬다면, KVO 패턴은 객체와 객체 사이의 관계를 다룰 때 적

velog.io

https://www.zehye.kr/ios/2020/03/19/11iOS_KVO/

 

KVO(Key Value Observing)란 무엇인가? · 지혜의 개발공부로그

KVO(Key Value Observing)란 무엇인가? 19 Mar 2020 | iOS 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다. KVO(Key-Value Observing) 특정 키의 값의 변화를 감지하기 위한 기능 모

www.zehye.kr