KVO 의미
객체의 어떤 값이 변경되었을 경우 UI에 반영하기 위해 컨트롤러는 해당 객체에 Observing을 도입하여 델리게이트에 특정 메시지를 보내 처리할 수 있도록 하는 것
property observer( willSet, didSet)과 아주 유사하다.
둘의 차이점은 뒷부분에 작성할 예정 ㅎ..
KVO는 swift코드로 좋지 못하다. 왜냐하면 Objective-C 런타임에 의존하기 있기 때문이다.
KVO Observing을 하기 위해서는 감시할 변수에 @objc dynamic을 사용해야 한다.
@objc
@objc는 swift로 컴파일을 할 때 objective-c 컴파일러를 사용하겠다는 의미이다.
dynamic
dynamic은 objective-c 문법인데 컴파일을 할 때 코드를 실행하는 것이 아닌 런타임 때 코드를 실행하겠다는 의미이다.
swift에서 dynamic dispatch와 유사
예시를 통해 알아보자
class SomeClass: NSObject{
@objc dynamic var value: String = "a"
}
let someobject = SomeClass()
someobject.observe(\.value, options: [.new, .old]) { object, change in
print( "object.value: \(object.value)")
// object.value: helo
print("change.newValue: \(change.newValue), change.oldValue: \(change.oldValue)")
// change.newValue: helo, change.oldValue: a
}
someobject.value = "helo"
class 내부에 선언되어 있는 value 변수 앞에 @objc dynamic을 붙어서 사용한다.
변수 value를 감시하기 위해 observe 메서드를 이용한다.
observe 첫 번째 매개변수: 감시할 변수
observe 두 번째 매개변수: options이지만 써도 되고 사용하지 않아도 된다.(optional)
observe 세 번째 매개변수: changeHandler 보통 클로저로 사용한다.
someobject.observe(\.value, options: [.new, .old]) { object, change in
print( "object.value: \(object.value)")
// object.value: helo
print("change.newValue: \(change.newValue), change.oldValue: \(change.oldValue)")
// change.newValue: helo, change.oldValue: a
}
이 부분을 해석하자면 변수 value를 감시할 것이고, options으로 newValue, oldValue를 사용할 것이다.
클로저 부분은 변화되었을 때 실행될 코드를 작성하면 된다.
RxSwift를 사용하고 접한 개념이다 보니 이해하기가 쉬웠다.
# 참고한 블로그
'iOS > Swift 상식' 카테고리의 다른 글
멀티 스레드 구현시 고려해야할 것들 (0) | 2023.02.19 |
---|---|
Delegates vs Notification 동작 방식 (0) | 2023.02.18 |
Singleton 패턴 알아보기 (0) | 2023.02.05 |
Delegate 패턴 알아보기 (0) | 2023.02.04 |
Instance Method, Type Method (0) | 2023.02.04 |