관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] KVO(Key-Value Observing) 본문

iOS 기본 (swift)

[iOS - swift] KVO(Key-Value Observing)

jake-kim 2021. 3. 7. 20:28

KVO(Key-Value Observing)

  • 특정 키의 값의 변화를 감지하기 위한 기능
  • `변수`에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법
  • Property Observers(willSet, didSet)과 유사하지만 KVO는 타입 정의 밖에서 observe를 추가한다는 점의 차이가 존재
    (Objective-c 런타임에 의존하기 있기 때문)
  • 사용할 땐 NSObject를 상속받기 위해 @objc dynamic를 반드시 붙여줘야 가능
    (dynamic 키워드: Objsective-c 문법의 하나로, 특정 method의 구현을 objective-런타임에서 dynamic dispatch를 활성화
  • Dynamic dispatch: 키 패스(KeyPath = \.) 이름을 이용해 프로퍼티의 주소를 찾게 하는 기능)

키 패스 (KeyPath)

  • 프로퍼티나 메소드등을 특정문자열로 표기하는 규칙
    ("value"라는 문자열을 넘겨주면 특정 클래스 오브젝트의 value라는 프로퍼티를 의미하는 것)

KVO 사용 방법

  • KVO기능은 NSObject에 지정되어 있기 때문에 NSObject를 상속받은 클래스에만 적용가능
  • 참고로, NSObject라는 무거운 것을 상속받아야 하므로 swift에서는 KVO를 쓰지 않는것이 좋음
class MyClass: NSObject {
    @objc dynamic var testStr: String = "init--"
}
  • observe()함수 호출하여 이벤트 구독
myClass.observe(\.testStr, options: [.new, .old]) { (object, chnage) in
    print("change event old => \(chnage.oldValue ?? "")")
    print("change event new => \(chnage.newValue ?? "")")
}
  • 값 대입 시 이벤트 발생
self.myClass.testStr = "test1"
self.myClass.testStr = "test2"

 

Comments