금요일 학습활동 시간에 배울 내용을 예습했다.
Key-Value Observing과 Property Obeserver 모두 property가 변할 때 이루어지는 처리와 관련된 내용이다.
노티피케이션 센터, 싱글톤, KVO, Property Observer까지 객체간 소통할 수 있는 방법들을 배우는 중인듯 ! 각각의 특징과 장단점을 파악하자!
다른 객체 property의 변화가 생기면, 객체에서 변화에 따른 처리를 자동으로 해주는 매커니즘이다.
다른 객체 property가 변하면, 변화를 감지하고 그에 따른 액션을 취하는 객체를 observer
라고 한다. observer
는 여러 객체들의 변화를 동시에 들을 수 있다. (observer : observed = 1 : 多 가능)
1. 관찰할 property에 어노테이션 붙이기
관찰 대상 property 정의 할 때 @objc dynamic
어노테이션을 추가한다.
class MyObjectToObserve: NSObject {
@objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
func updateDate() {
myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
}
}
2. Observer 정의하기
@objc
프로퍼티로 정의한다.NSKeyValueObservation
타입의 변수(observation)를 정의한다.observe(_:options:changeHandler:)
를 정의한 후, observation
에 할당한다.class MyObserver: NSObject {
@objc var objectToObserve: MyObjectToObserve
var observation: NSKeyValueObservation?
init(object: MyObjectToObserve) {
objectToObserve = object
super.init()
observation = observe(
\.objectToObserve.myDate,
options: [.old, .new]
) { object, change in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
}
}
}
observe(_:options:changeHandler:)
- _ : keypath
- option : 관찰대상의 new, old property value. (생략하면 nil)
- changehandler : 관찰대상의 값이 변하면 호출될 함수
3. Observer와 관찰할 property 연결
Observer의 Initializer에 관찰할 Property의 인스턴스를 전달하기
let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)
4. Property가 변하면 자동으로 changehandler가 호출 된다!
observed.updateDate() // Triggers the observer's change handler.
// Prints "myDate changed from: 1970-01-01 00:00:00 +0000, updated to: 2038-01-19 03:14:08 +0000"
property의 값에 새로운 값이 저장될 때 (같은 값이어도 가능)
값이 저장되기 직전과 값이 저장된 직후에 미리 지정해둔 처리를 할 수 있다.
willSet(newValue)
값이 저장되기 직전에 호출.
didSet(oldeValue)
값이 저장된 직후에 호출
클래스 사용하기
와 구조체 내에서 mutating키워드 쓰기
모두 객체내의 프로퍼티를 변경할 수 있다.
값 전달방식이 참조타입이어야해서 클래스를 선택했다면,
mutating을 쓴 구조체를 써도 동일할 것이란 생각이 들었다.
둘의 차이는 뭘까?