[iOS] KVO 구현하기

[iOS] KVO 구현하기

·

2 min read

🗝 KVO란?

KVO는 Key-Value observing 이다. 다른 오브젝트의 프로퍼티 속성이 변경되었을 때, 오브젝트에서 변경사항을 알 수 있게 해주는 것 이다. KVO는 NSObject 를 상속받은 클래스에서 사용할 수 있다.

오브젝트끼리의 응집력(끈끈하게 묶어줌)이 좋기 때문에, 항상 같이 다녀야 하고 코드의 재활용성이 떨어진다.

👊🏻 KVO 사용법

KVO 를 swift 코드에 적용해 보자. 📦 택배 클래스를 만들고, 택배의 배송정보가 업데이트 되면 자동으로 받아서 볼 수 있도록 하는 코드를 만들어 보자.

트랙킹할 클래스 지정

먼저 트랙킹할 (정보를 가져올) 클래스를 지정한다.

그 클래스를 아래와 같이 설정해 준다.

class Shipping: NSObject {
  @objc dynamic var teakbea: String = "준비중..."
}

KVO 라는 기능 자체가 NSObject 안에 들어있기 때문에 NSObject 를 상속 받아야 한다. 트랙킹할 변수에 @objc dynamic 을 붙여준다. (dynamic 키워드는 objec-C 에서 사용되는 키워드 중에 하나이다.)

옵저버 생성

그럼이제 변수가 변경 되었을 때 실행할 부분을 만들어주자. 인스턴스를 생성하고 인스턴스의 observe 를 붙인다.

var shipping = Shipping()

shipping.observe(\.teakbea, options: [.old, .new]) { object, change in
    guard let old = change.oldValue else { return }
    guard let new = change.newValue else { return }
    print("이전값: \(old) 지금값: \(new)") }

observe 란 메서드의 3개의 프로퍼티가 필요하다.

  • key Path
  • options
  • changeHandler

KeyPath

/. 로 시작하고 . 뒤에 트랙킹 하는 프로퍼티 값을 설정해 준다.

options 의 종류

options 부분에는 무슨 값을 가져올 것인지를 넣어줄 수 있다.

old : 이전값 new : 현제값 initial : 초기화 시에도 옵져버 핸들러를 호출할 것이냐? prior : 이전의 상태와 지금의 상태를 다 주는 옵션

changeHandler

클로저 타입이다.

{ (object, change) in 구현부 }

첫번째 파라미터인 오브젝트는 말그대로 우리가 추적하고 있는 클래스 인스턴스를 의미한다. object.name 이런 식으로 값을 가져올 수 있다.

두번째 파라미터인 체인지는 변경된 값이 들어 간다. .oldvalue .newvlaue 등으로 접근이 가능하다.

KVO 옵져버를 생성해 준 시점부터 인스턴스 안의 프로퍼티 값이 변경되면 changeHandle 부분의 함수가 구현된다.

class Shipping: NSObject {
  @objc dynamic var teakbea: String = "준비중..."
}

var shipping = Shipping()

shipping.observe(\.teakbea, options: [.old, .new]) { object, change in
    guard let old = change.oldValue else { return }
    guard let new = change.newValue else { return }
    print("이전값: \(old) 지금값: \(new)") }

shipping.teakbea = "배송이 시작되었어요"
shipping.teakbea = "배송중 입니다."
shipping.teakbea = "배송이 완료되었습니다."

//이전값: 준비중... 지금값: 배송이 시작되었어요
//이전값: 배송이 시작되었어요 지금값: 배송중 입니다.
//이전값: 배송중 입니다. 지금값: 배송이 완료되었습니다.