[ios] Key-Value Observing in Swift4
[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
값은 갱신될 것입니다. 저는 이 갱신되는 값을 관찰해보도록 하겠습니다.
observe(_:options:changeHandler)
은 일종의 관찰자를 반환한다. 이렇게 반환된 관찰자는 반드시 저장하고 있어야 한다. 저장을 하지 않는다면 해당 코드는 호출되지 않습니다.- 관찰자와 행위를 정의해주는 메소드입니다. 위에서 언급했듯이
Configuration
인스턴스를 관찰하게 되는데 KeyPath를\.property.property
형식으로 관찰하고자 하는 프로퍼티에 접근할 수 있습니다. 또한options
파라미터로 관찰할 변화의 상태들을 넣어줄 수 있습니다. 먼저.new
넘겨주어 새 값이 할당되었을 때 핸들러가 동작하도록 작성해보겠습니다. 그리고 핸들러는 두 가지 파라미터를 같이 넘기는데 두 번째 인자인NSKeyValueObservedChange<Value>
객체를 사용하여.newValue
,.oldValue
등 관찰한 값의 변화들이 담겨져 있어 핸들러 안에서 활용이 가능합니다. - 값의 갱신
- 관찰자의 역할이 다하면 이를 해제시켜줍니다.
이렇게 되면 버튼이 눌렸을 때 갱신된 값이 레이블에 담기게 됩니다.
그럼 이번엔 인스턴스의 초기화 시점을 관찰하는 .initial
옵션을 추가해보도록 하겠습니다. 무엇이 달라질까요?
결과를 살펴보도록 하겠습니다.
차이점이 보이시나요? 앱이 실행된 즉시 값이 레이블에 할당된 것을 확인하실 수 있습니다. .new
옵션만을 넣어주었을 때는 값이 실제로 한번 갱신되었을 때부터 레이블에 그 변화가 적용되었는데 .initial
옵션을 추가함으로써 생성되는 시점도 관찰을 하기 때문에 앱이 실행된 즉시 (객체가 생성된 시점) 바로 그 값이 레이블에 반영이 되는 것입니다.
이런 방법으로 값의 변화를 관찰할 시점을 옵션 값으로 넣어주어 적절히 처리할 수 있게 됩니다.
마무리
오늘은 이렇게 간단하게 보다 편리하게 KVO를 사용하는 방법에 대해 알아보았습니다. 다음 시간에는 오늘 사용해본 방법이 아닌 원래 사용하던 KVO 방식에 대해 알아보는 시간을 갖도록 하겠습니다.
감사합니다.
Source : GitHub
참고자료