iOS 개발 기록

KVC와 KVO란? 본문

Swift

KVC와 KVO란?

택꽁이 2022. 5. 31. 16:34
728x90

KVC와 KVO란?

KVC 정의
 : Key-Value-Coding.

  • Key는 String
  • Key나 KeyPath를 이용해 간접적으로 데이터를 가져온다.
  •  객체간 의존성을 낮추고, 결합도가 낮은 소프트웨어를 개발할 수 있게 한다. 
  • NSKeyValueCoding 프로토몰에 의해 정의한다. 

 

 

KVC 로직 

1. Key와 일치하는 프로퍼티를 찾는다. 
2. 일치하는 프로퍼티가 없다면 Key와 일치하는 인스턴스 변수를 찾는다. 

3. 일치하는 프로퍼티나 인스턴스 변수가 있다면 적용, 없으면 'valueForUndiginedkey'나 'setValue:forUndefinedkey'를 호출한다.

 

 

사용 

위와 같은 로직으로 동작하기 때문에 프로퍼티를 통한 직접 접근보다 느리며, runtime에 접근하기 때문에 Key가 일치하지 않아 크래시가 발생하기도 한다. 소프트웨어 구조적 측면에서 유연성이 필요한 경우에만 사용하는 것이 좋다. 

struct Hop { 
    var hopName: String 
}

struct Beer { 
    var hop: Hop
}

let citra = Hop(hopName: "citra")
let beer = Beer(hop: citra)

let IPA = beer[keyPath: \.hop]
let likeHop = beer[keyPath: \.hop.hopName]
print(likeHop)	// citra

 

 

 

 

 

KVO 정의 

: Key-Value-Observing.  객체의 프로퍼티가 변경되는 것을 감지하고 알려준다.
아는 타입이라면 willSet, didSet으로 구현할 수 있겠지만 외부 라이브러리 등 모르는 타입으로 정의된 경우에 KVO를 통해 관찰할 수 있다. 

 

사용 예 

combine 

let queue = OperationQueue()

let subscription = queue.publisher(for: \.operationCount)
    .sink {
        print("Outstanding operations in queue: \($0)")
    }

 

Custom
:  NSObject 상속, @objc dynamic 을 통해서 사용 

class TestObject: NSObject {
    @objc dynamic var integerProperty: Int = 0
}

let obj = TestObject()

let subscription = obj.publisher(for: \.integerProperty)
    .sink {
        print("integerProperty changes to \($0)")
    }

obj.integerProperty = 100
obj.integerProperty = 200
integerProperty changes to 0
integerProperty changes to 100
integerProperty changes to 200