Swift + iOS/iOS

[ios] Key-Value Observing in Swift4

군옥수수수 2018. 6. 10. 21:35

[ios] Key-Value Observing in Swift4


오늘은 Key-Value Observing, KVO에 대해 간단히 알아보도록 하겠습니다. Swift4로 넘어오면서 KVO의 방식에도 변화가 있었습니다.


Swift4 이전에는 Observer와 Action 메소드를 따로 각각 별개로 정의해주었어야 했는데 Swift4의 observe(_:options:changeHandler) 메소드의 등장으로 Observer와 Action을 동시에 정의해줄 수 있게 되었습니다. 또한 기존의 KeyPath를 문자열로 입력하던 것과 다르게 프로퍼티로 접근이 가능해졌습니다.


사실 이외에도 context를 사용하지 않는 점 등 여러 변화가 있으나 제가 느끼기에 가장 큰 변화는 바로 가독성입니다. 이전의 KVO 방식은 Objective-C에서 사용하던 방법을 Swift에서 억지로 사용한 느낌이 없지 않아 있었고 가독성 또한 굉장히 떨어졌습니다. 하지만 observe(_:options:changeHandler)의 등장으로 보다 편리하게 값의 변화를 관찰할 수 있게 되었고 사용하기 굉장히 편리해졌습니다.


사실 Swift에는 willSet, didSet도 존재하지만 이 둘은 정의부에서의 관찰이었다면 KVO는 정의부 바깥에서 관찰 행위를 해주는 방법입니다. 그렇기 때문에 좀 더 느슨한 구조를 설계할 수 있습니다.


그럼 바로 코드를 통해 살펴보도록 하겠습니다. 먼저 값의 변화를 관찰할 객체를 만들어보도록 하겠습니다.


KVO는 기본적으로 Objective-C 런타임에서 동작하기 때문에 NSObject를 상속받아야 하고, @objc 선언이 필요합니다. 또한 값의 변화를 관찰할 프로퍼티 앞에는 dynamic이라는 키워드도 붙여야 합니다. dynamic 앞에는 역시 @objc 키워드를 붙여야 하는데 이를 정의하려는 타입 앞에 @objcMembers를 붙인다면 이를 생략할 수 있습니다.


그리고 저는 Configuration 클래스를 관리하는 Manager 클래스를 정의하였습니다.


updateConfiguration 메소드가 호출되면 Configuration 인스턴스의 updateAt 값은 갱신될 것입니다. 저는 이 갱신되는 값을 관찰해보도록 하겠습니다.


  1. observe(_:options:changeHandler) 은 일종의 관찰자를 반환한다. 이렇게 반환된 관찰자는 반드시 저장하고 있어야 한다. 저장을 하지 않는다면 해당 코드는 호출되지 않습니다.
  2. 관찰자와 행위를 정의해주는 메소드입니다. 위에서 언급했듯이 Configuration 인스턴스를 관찰하게 되는데 KeyPath를 \.property.property 형식으로 관찰하고자 하는 프로퍼티에 접근할 수 있습니다. 또한 options 파라미터로 관찰할 변화의 상태들을 넣어줄 수 있습니다. 먼저 .new 넘겨주어 새 값이 할당되었을 때 핸들러가 동작하도록 작성해보겠습니다. 그리고 핸들러는 두 가지 파라미터를 같이 넘기는데 두 번째 인자인 NSKeyValueObservedChange<Value> 객체를 사용하여 .newValue , .oldValue 등 관찰한 값의 변화들이 담겨져 있어 핸들러 안에서 활용이 가능합니다.
  3. 값의 갱신
  4. 관찰자의 역할이 다하면 이를 해제시켜줍니다.

이렇게 되면 버튼이 눌렸을 때 갱신된 값이 레이블에 담기게 됩니다.


  




그럼 이번엔 인스턴스의 초기화 시점을 관찰하는 .initial 옵션을 추가해보도록 하겠습니다. 무엇이 달라질까요? 


결과를 살펴보도록 하겠습니다.


   


차이점이 보이시나요? 앱이 실행된 즉시 값이 레이블에 할당된 것을 확인하실 수 있습니다. .new 옵션만을 넣어주었을 때는 값이 실제로 한번 갱신되었을 때부터 레이블에 그 변화가 적용되었는데 .initial 옵션을 추가함으로써 생성되는 시점도 관찰을 하기 때문에 앱이 실행된 즉시 (객체가 생성된 시점) 바로 그 값이 레이블에 반영이 되는 것입니다.


이런 방법으로 값의 변화를 관찰할 시점을 옵션 값으로 넣어주어 적절히 처리할 수 있게 됩니다.


마무리

오늘은 이렇게 간단하게 보다 편리하게 KVO를 사용하는 방법에 대해 알아보았습니다. 다음 시간에는 오늘 사용해본 방법이 아닌 원래 사용하던 KVO 방식에 대해 알아보는 시간을 갖도록 하겠습니다.

감사합니다.


Source : GitHub


참고자료


  1. What is Key-Value Observing
  2. Using Key-Value Observing