KVO (Key-value observing)
Key와 Value의 쌍으로 옵저빙하는 것
Key-value observing is a Cocoa programming pattern you use to notify objects about changes to properties of other objects. It’s useful for communicating changes between logically separated parts of your app—such as between models and views. You can only use key-value observing with classes that inherit from NSObject.
다른 객체의 프로퍼티 변경사항을 객체에게 알려주는 코코아 프로그래밍 패턴
Model과 View와 같이 논리적으로 분리된 파트사이에서 변경사항을 전달하는 데 유용하다.
objective-c에서 사용하던 방식이라고 생각하면 된다.
NSObject를 상속하는 클래스만 key-value observing을 사용할 수 있다.
Observig을 하기 위한 초기 설정(Annotate a Property for Key-Value Observing)
|
|
이름과 나이를 프로퍼티로 가지는 Person이라는 클라스가 있다고 했을 때, KVO를 적용하기 위해서는 무엇을 해야 할까?
NSObject를 상속하는 클래스를 정의한다. 상속을 받아야 하기 때문에class에서만 가능하다.- observe 하려는 프로퍼티에
@objcattribute와dynamicmodifier를 붙여준다.
|
|
Obsever 정의(Define an Observer)
|
|
jae라는 이름의 Person 인스턴스를 생성하고 20살로 설정하였다.gundy라는 이름의 변수(예제가Person타입이라 사람으로 지정했고 애플 사이트에서는observation으로 되어 있다)에jae의age프로퍼티에 대한 옵저버NSKeyValueObservation을 저장한다.- 이제부터는
jae의age값이 변경될 때마다,gundy에게 알려주게 된다.
Observing이라는 네이밍이 다른 객체가jae를 들여다보고 있는 것 같지만, 실제로는jae자신이 들여다보고 있다가 값이 변경되면gundy에게 Optional 값으로 알려주는 형태이다.
gundy는jae가 보내준 노티를 받으면{ }안의 코드(여기서는 값이 바뀜을 출력)를 실행한다.
If you don’t need to know how a property has changed, omit the options parameter. Omitting the options parameter forgoes storing the new and old property values, which causes the oldValue and newValue properties to be nil.
애플 문서에서는 속성이 어떻게 변경되었는지 알 필요가 없는 경우 옵션 매개변수 options: [.old, .new]를 생략할 수 있고, 이 경우에는 oldValue와 newValue 프로퍼티가 nil이 된다. ➡️ 그럼 KVO를 왜 쓰는거지❓
|
|
KVO 장단점
장점
- 두 객체 사이의 동기화가 용이하다.
- 관찰된 프로퍼티의 oldValue와 newValue를 얻을 수 있다.
- KeyPath를 가져오기 때문에(
\Person.age) Nested object를 관찰할 수 있다.
단점
-
NSobject를 상속받는 객체에서만 사용이 가능하다. -
여러값을 관찰할 때는 복잡한
if문을 사용해야 한다.
Reference
Using Key-Value Observing in Swift
NSKeyValueObservingOptions
Zedd - Key-Value Observing(KVO) in Swift
Key-Value Coding(KVC) / KeyPath in Swift
leeari95 - KVO(Key-value observing)
Delegate, NOTIFICATION,KVO pros and cons