iyOmSd/Title: iOS Think🤔

[iOS] Swift Event - Delegate, Notification, KVO란? (3/3)

냄수 2020. 3. 28. 01:29
반응형

2020/03/09 - [iyOmSd/Title: iOS Think🤔] - Swift Event - Delegate, Notification, KVO란? (2/3)

2020/02/25 - [iyOmSd/Title: iOS Think🤔] - Swift Event - Delegate, Notification, KVO란? (1/3)

 

 

앞서 게시글에서 Delegate, Notification에대해 알아봤어요!!

간단하게 다시 리마인드를 하자면

Delegate - 위임자, 대리자

Notification - broadcast 이벤트

엿죠?!?

 

이번 게시글에서는 마지막으로 KVO에 대해서 알아볼게요

KVO는 Key-Value Observing 의 약자에요

Objective-C 런타임에 의존하는 방식이구요

@objc dynamic 을 붙여서 사용해야해요

 

특징으로는 아래와 같아요

  • 객체와 객체사이의 관계를 다룸

  • 메소드나 다른 액션에서 나타나는것이아니라 프로퍼티의 상태에 반응

  • 두 객체 사이의 정보 맞춰주기 쉬움

  • new, old value쉽게 얻을수 있음

  • key path로 옵저빙하기때문에 nested objects(Json Object)도 옵저빙가능

  • NSObject를 상속 받는 객체에서만 사용가능

  • dealloc 될대 옵저버 지워줘야함

  • 많은 value감지시 많은 조건문 필요

  • didSet이나 willSet과 기능이 비슷함

 

사용예시

class KVOTest: NSObject {
    @objc dynamic var testString = "hihihi"
}
        
let kvo = KVOTest()
var ob = kvo.observe(\.testString, options: [.new, .old]) { (changeObject, value) in
    print("kvo - value change: \(value)")    // value change: NSKeyValueObservedChange<String>(kind: __C.NSKeyValueChange, newValue: nil, oldValue: nil, indexes: nil, isPrior: false)
    print("kvo - value change: \(changeObject.testString)")    // value change: 안녕하세여
        }

//ob.invalidate()    // observe 제거
        
print("kvo - \(kvo.testString)")    // hihihi
kvo.testString = "안녕하세여"
print("kvo - \(kvo.testString)")    //안녕하세여
kvo.testString = "마지막문자열"
//kvo - value change: NSKeyValueObservedChange<String>(kind: __C.NSKeyValueChange, newValue: Optional("마지막문자열"), oldValue: Optional("안녕하세여"), indexes: nil, isPrior: false)

KVOTest클래스의 value변수를 관찰할거에요

 

kvo 인스턴스변수를 만들어주고

kvo 인스턴스에 observe(\.[관찰할 변수명])을 이용해서 KVO를 사용할거에요

여기서 options을 추가하지 않으면 old, new값을 가져올수가 없어요!!

nil값이 나오죠!!

 

changeObject는 KVO타입이에요

관찰중인 객체를 참조하며 객체의 프로퍼티에 접근할 수 있어요

 

value는 NSKeyValueObservedChange<String>타입이에요

value에서는 old, new등 옵션에서 추가한 프로퍼티를 접근할 수 있어요

 

화면을 나가거나 사용하지 않을 때는 꼭

ob.invalidate()

를 추가해서 옵저버를 해제해줘야해요

 

Swift에서는 위에서 언급했지만

 

didSet이나 willSet과 기능이 비슷함

 

Objective-C에서 사용하던거를 계속 사용해오고있는 기능이라서

Swift에서는 간단하게 옵저빙을 할때는 굳이 KVO를 안쓰고 프로퍼티 감시자를 사용해도 될것 같은 생각이 들어요

 

 

 

 

 

 

반응형