요즘 MVVM을 개인 프로젝트에 적용하다 보니 observable pattern을 익혀나가고 있습니다. 그러다 보니.. Key-Value Observing 방식이 어떻게 사용되는지 간단히 이해하고자 간단히 정리해보았습니다.
Key - Value Observing 이란?
Key-Value Observing(KVO)는 프로퍼티나 다른 객체의 변화를 객체에 알릴 수 있는 Cocoa programming pattern입니다. NSObject
를 상속받은 클래스에서만 Key-Value Observing을 사용할 수 있습니다. 앞으로는 Key-Value Observing을 KVO로 부르겠습니다.
KVO를 사용하기 위해 프로퍼티에 Annotation 붙이기
KVO는 ObjectiveC의 런타임에 의존하기 때문에, @objc
attribute와, dynamic
modifier를 observe하고 싶은 프로퍼티에 붙여줍니다.
dynamic
은 옵젝씨 런타임에 동적 디스패치를 사용한다고 알려주는 modifier라고 합니다.
아래 예제는 myDate
프로퍼티가 observe될 수 있다는 것을 의미합니다.
class MyObjectToObserve: NSObject {
@objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
func updateDate() {
myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
}
}
Observer 정의하기
상태 변화를 나타낼 프로퍼티에 annotation을 붙였다면, 이를 관찰(observe)할 옵저버가 필요하겠죠?
옵저버 클래스의 인스턴스는 프로퍼티에서의 변화에 관한 정보를 관리합니다. observer를 만들면, 관찰하고 싶은 프로퍼티의 key path를 사용해 observe(_:options:changeHandler:)
메소드를 호출함으로써 observation을 수행할 수 있습니다.
아래 예제에서는 \.objectToObserve.myDate
key path는 MyObjectToObserve
의 myDate
프로퍼티를 언급하고 있습니다.
class MyObserver: NSObject {
@objc var objectToObserve: MyObjectToObserve
var observation: NSKeyValueObservation?
init(object: MyObjectToObserve) {
objectToObserve = object
super.init()
observation = observe( \.objectToObserve.myDate, options: [.old, .new]) { object, change in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
}
}}
option
파라미터는 프로퍼티의 값을 전달할 수 있습니다. 그래서 만일 상태가 변하는 것만 알고 싶고 프로퍼티의 값이 궁금하지 않다면 생략할 수 있습니다.
옵저버와 프로퍼티 연동하기
그 다음에는 만들어둔 옵저버와 프로퍼티를 연동해야 합니다. 아래와 같이 옵저버의 initializer의 object
에 관찰하려는 값을 넣어주어 연동할 수 있습니다.
let observed = MyObjectToObserve() // observe하려는 프로퍼티가 있는 클래스
let observer = MyObserver(object: observed)
이렇게 아주 간단하게 KVO을 iOS에서 사용하는 방법을 정리해보았는데요, 다음번에는 Combine
과 함께 사용하는 KVO방식을 한번 정리해보도록 하겠습니다. 이만 총총..
References
- https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key-value_observing_in_swift
- https://www.reddit.com/r/iOSProgramming/comments/419hfg/what_is_dynamic_variable_in_swift/
'iOS > Frameworks' 카테고리의 다른 글
[RxSwift] Observable, Observer, Subject, Disposing 개념 (0) | 2021.12.29 |
---|---|
RxSwift vs Combine - 무엇을 사용할 것인가? (0) | 2021.10.21 |
댓글