[Swift] : KVO ( Key-Value Observing )
오늘은 KVO( Key-Value Observing )에 대해 알아보자!
먼저 KVC ( Key-Value Coding )에 대해 궁금하다면 아래 글을 읽어보자!
[Swift] : KVC ( Key - Value Coding )
KVC ( Key - Value Coding ) 란 무엇일까? 객체의 프로퍼티에 접근할 때 사용하는 간접적인 코딩 방식이다. 객체의 프로퍼티에 접근하는 방식은 직접적인 방식과, 간접적인 방식으로 볼 수 있다. 직
seorin-yy.tistory.com
Observer를 직역하면 관찰자라는 뜻이다.
Swift 에서 Observer 는 Observe( 관찰 ) 하고자 하는 프로퍼티가 변경됐는지 관찰하는 것이다!
예시를 들어보자
observe 하려는 프로퍼티가 아래의 Human의 Name 이라고 가정하자
class Human: NSObject{
@objc dynamic var name : String
init(name : String) {
self.name = name
}
}
Key-Value 는 object-c 에서 지원해주는 기능이기 때문에
--> Human이 NSObject를 상속하게 해주자
--> 그리고 name 프로퍼티에 @objc attribute 를 추가해주자
그리고 프로퍼티 Name 을 Observe 할 것이기 때문에 dynamic modifier 또한 추가해주자
그리고 human 을 생성해주자!
let human = Human(name: "서린")
자 그럼 이제 human 의 이름이 바뀌었는지 관찰해보고, 바뀌었을 때 어떤 이름에서 어떤 이름으로 바뀌었는지 print 해보는 코드를 작성해보자!
human.observe(\.name, options: [.old, .new]) { (object, change ) in
print("name이 \(change.oldValue)에서 \(change.newValue)로 바뀌었다!")
}
observe 함수를 통해 바뀐 것을 관찰하는 코드이다
keyPath 에 대해 궁금하다면 KVC 글을 참고하자!
keyPath 속 프로퍼티가 바뀌었을 때 changeHandler 함수로 처리해주는 방식이다
이제 관찰하는 코드를 작성했으므로 이름을 바꾸게 된다면
print("이름을 바꿔보자!!")
human.name = "서린이 아닌 다른 이름"
출력이 잘 나올 것이다!
observe 함수에서 사용하는 옵션에는 총 old, new, initial, prior 4가지가 있다.
.old 는 change.oldValue 를 사용할 수 있게 해주는 것이고
.new 는 change.newValue 를 사용할 수 있게 해주는 옵션이다.
.initial 은 프로퍼티가 바뀌는 경우 뿐만 아니라 초기화 할 시( observe를 추가하는 시점 )에도 changeHandler 함수를 실행하게 만드는 옵션이다.
.prior는 changeHandler 함수를 두 번 실행하게 하는데, 처음에는 oldvalue 만, 두번째에는 oldValue, newValue 를 사용할 수 있게 한다.
KVO vs willSet, didSet
KVO는 사실 didSet, willSet 으로도 충분히 구현할 수 있어보인다. 그럼에도 KVO를 사용하는 이유는
willSet, didSet 은 사용자가 만든 구조체, 클래스에 직접 정의해서 사용하기 때문에 외부라이브러리의 객체를 사용할 경우 observe 가 불가능하다.
하지만 KVO는 keyPath 만 알면 어떤 객체든지 observe가 가능하다는 장점이 있다