iOS

[Swift] : KVO ( Key-Value Observing )

SeorinY 2022. 10. 22. 17:08

오늘은 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가 가능하다는 장점이 있다