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를 안쓰고 프로퍼티 감시자를 사용해도 될것 같은 생각이 들어요
'iyOmSd > Title: iOS Think🤔' 카테고리의 다른 글
[iOS] initialization 생성자 (0) | 2020.08.13 |
---|---|
[iOS] Swift Memory - COW (Copy On Write) (0) | 2020.08.03 |
[iOS] Swift Event - Delegate, Notification, KVO란? (2/3) (0) | 2020.03.09 |
[iOS] Swift Event - Delegate, Notification, KVO란? (1/3) (0) | 2020.02.25 |
[iOS] Swift Thread - Dispatch Queue, Operation Queue (0) | 2019.12.21 |