iOS/Swift 상식

KVO(Key Value Observing) 동작 방식

HJ39 2023. 2. 11. 21:46

KVO 의미

객체의 어떤 값이 변경되었을 경우 UI에 반영하기 위해 컨트롤러는 해당 객체에 Observing을 도입하여 델리게이트에 특정 메시지를 보내 처리할 수 있도록 하는 것

 

property observer( willSet, didSet)과 아주 유사하다.

둘의 차이점은 뒷부분에 작성할 예정 ㅎ..

 

KVO는 swift코드로 좋지 못하다. 왜냐하면 Objective-C 런타임에 의존하기 있기 때문이다.

KVO Observing을 하기 위해서는 감시할 변수에 @objc dynamic을 사용해야 한다.

 

더보기

@objc

@objc는 swift로 컴파일을 할 때 objective-c 컴파일러를 사용하겠다는 의미이다.

 

dynamic

dynamic은 objective-c 문법인데 컴파일을 할 때 코드를 실행하는 것이 아닌 런타임 때 코드를 실행하겠다는 의미이다.

swift에서 dynamic dispatch와 유사

 

예시를 통해 알아보자

class SomeClass: NSObject{
    @objc dynamic var value: String = "a"
}

let someobject = SomeClass()

someobject.observe(\.value, options: [.new, .old]) { object, change in
    print( "object.value: \(object.value)")	
    // object.value: helo
    print("change.newValue: \(change.newValue),  change.oldValue: \(change.oldValue)")
    // change.newValue: helo,  change.oldValue: a
}

someobject.value = "helo"

class 내부에 선언되어 있는 value 변수 앞에 @objc dynamic을 붙어서 사용한다.

 

변수 value를 감시하기 위해 observe 메서드를 이용한다.

observe 첫 번째 매개변수: 감시할 변수

observe 두 번째 매개변수: options이지만 써도 되고 사용하지 않아도 된다.(optional)

observe 세 번째 매개변수: changeHandler 보통 클로저로 사용한다.

 

 

someobject.observe(\.value, options: [.new, .old]) { object, change in
    print( "object.value: \(object.value)")	
    // object.value: helo
    print("change.newValue: \(change.newValue),  change.oldValue: \(change.oldValue)")
    // change.newValue: helo,  change.oldValue: a
}

이 부분을 해석하자면 변수 value를 감시할 것이고, options으로 newValue, oldValue를 사용할 것이다.

클로저 부분은 변화되었을 때 실행될 코드를 작성하면 된다.

 

RxSwift를 사용하고 접한 개념이다 보니 이해하기가 쉬웠다.

 

 

 

# 참고한 블로그

  1. https://www.zehye.kr/ios/2020/03/19/11iOS_KVO/
  2. https://woozzang.tistory.com/124

'iOS > Swift 상식' 카테고리의 다른 글

멀티 스레드 구현시 고려해야할 것들  (0) 2023.02.19
Delegates vs Notification 동작 방식  (0) 2023.02.18
Singleton 패턴 알아보기  (0) 2023.02.05
Delegate 패턴 알아보기  (0) 2023.02.04
Instance Method, Type Method  (0) 2023.02.04