ABOUT ME

woongS, iOS, succesS 삼쓰의 개발 블로그

Today
Yesterday
Total
  • KVO(Key-Value-Observing)
    Swift 2019. 9. 20. 17:49
    728x90

    객체의 어떤 값이 변경되었을 경우 이를 감지하기 위해 사용한다.

    KVO는 변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법이다. property observers(willset , didSet)과 아주 유사한데 KVO는 타입 정의 밖에서 observe를 추가한다는 점이 다르다.

    KVO는 순수 스위프트 코드로는 그리 좋지 않은데, Objective-c 런타임에 의존하고 있기 때문이다. 그래서 NSObject 를 상속받기 위해 @objc 를 반드시 붙여줘야 한다. 특히 KVO는 속성 각각에 @objc dynamic 을 붙여줘야 한다.

    dynamic 은 objective-c 의 문법의 하난데, 특정 method나 function의 구현을 objective-c 런타임에서 하겠다고 결정하는 것이다. 예를들어, 하위클래스가 상위 클래스의 메서드를 override 할 때 dynamic dispatch 는 어떤 메서드의 구현해야 하는지 파악한다.

    예를 살펴보자,

    @objc class Person: NSObject {
        @objc dynamic var name = "Woongs"
    }
    
    let woongs = Person

    그리고 이제 처음에 말했듯이 상태 변화를 감지하기 위한 코드를 붙여, 변수가 변경될 때마다 코드가 실행되도록 해보자.

    woongs.observe(\Person.name, options: .new) { person, change in 
        print("I'm now called \(person.name)")
    }

    이렇게 하면 새로운 변수가 들어오는지 보고 있다가 변수가 set 되자마자 person 의 이름을 print 한다.


    비록 KVO가 순수한 Swift 코드는 아니지만 Apple의 자체 API로 작업할 때는 더 좋다. 이들이 모두 objective-c로 되어있기 때문에 모두 @objc 와 dynamic이기 때문이다.

    하지만 주의해야 할 것은, 비록 UIKit의 많은 부분이 KVO와 작동하지만 이는 약속이라기 보다는 우연으로 봐야한다. 애플은 앞으로도 UIKit이 KVO와 호환될거라고 보장하지 않는다.

    참고

    What is key-value observing?

    Using Key-Value Observing in Swift

    'Swift' 카테고리의 다른 글

    댓글

Designed by Tistory.