28.10.21 릴리 TIL

Lily·2021년 10월 28일
0

Today I Learned

목록 보기
16/30

오늘 배운 내용🤓


금요일 학습활동 시간에 배울 내용을 예습했다.
Key-Value Observing과 Property Obeserver 모두 property가 변할 때 이루어지는 처리와 관련된 내용이다.

노티피케이션 센터, 싱글톤, KVO, Property Observer까지 객체간 소통할 수 있는 방법들을 배우는 중인듯 ! 각각의 특징과 장단점을 파악하자!


1. Key-Value Observing

다른 객체 property의 변화가 생기면, 객체에서 변화에 따른 처리를 자동으로 해주는 매커니즘이다.

다른 객체 property가 변하면, 변화를 감지하고 그에 따른 액션을 취하는 객체를 observer 라고 한다. observer는 여러 객체들의 변화를 동시에 들을 수 있다. (observer : observed = 1 : 多 가능)

  • MVC패턴에서 객체들 간에 소통할 수 있는 방법 중 하나
    • 예를 들어, Model과 View간의 상태를 동기화 해 줄 수 있음
  • UIKitFrameWork의 class들은 KVO를 지원하지 않음
  • NSObject를 상속받은 class만 가능
  • Notification Center와 달리 direct한 소통 방법

💻 How to

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 정의하기

  • Observer 클래스를 만든다.
  • 관찰대상을 @objc 프로퍼티로 정의한다.
  • NSKeyValueObservation 타입의 변수(observation)를 정의한다.
  • 관찰대상을 전달받아 초기화하는 Initializer를 정의한다.
  • Initializer내에 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"

2. Property Obeserver

property의 값에 새로운 값이 저장될 때 (같은 값이어도 가능)

값이 저장되기 직전값이 저장된 직후에 미리 지정해둔 처리를 할 수 있다.

willSet(newValue)

값이 저장되기 직전에 호출.

didSet(oldeValue)

값이 저장된 직후에 호출

고민한 내용🧐


class vs struct - mutating

클래스 사용하기구조체 내에서 mutating키워드 쓰기
모두 객체내의 프로퍼티를 변경할 수 있다.

값 전달방식이 참조타입이어야해서 클래스를 선택했다면,
mutating을 쓴 구조체를 써도 동일할 것이란 생각이 들었다.

둘의 차이는 뭘까?

profile
i🍎S 개발을 합니다

0개의 댓글