Sign In
상태
Empty
담당자
Empty
작성자
한결
작성시각
Observable 패턴
View와 Model을 연결해주는 ViewModel에서 데이터 '값'의 변화를 포착해서 원하는 동작을 만들어내는 클로저를 맵핑하기 위해서 Observable이라고 하는 클래스를 자주 사용한다.
•
View에서 다루고자 하는 값을 ViewModel에서 관리하고 → Observable한 input 값 설정
•
View에서는 이 값을 변화시키려고 하는 액션(ex. 텍스트필드 입력, 버튼 터치, 테이블뷰 업데이트 등)을 ViewModel에게 인지시킨다. → Observable한 input 값 변경 + 클로저 맵핑
•
Model에서는 View에 보여줄 데이터를 가지고 있고(가지고 있다기 보다는 데이터와 관련된 로직을 관리하는) 이 데이터를 View에 전달하기 위해서 ViewModel을 활용한다.
→
Observable한 output 값 설정
•
ViewModel에서는 View에서 들어온 액션 + 변경된 값을 기반으로 내부 로직(Model 로직에 기반한)을 돌려 View가 원하는 형태의 값으로 반환해준다. → Observable한 output 값 변경 후 반환
final class Observable<T> {
    private var handler: ((T) -> ())?

    var value: T {
        didSet {
            // 2. 초기화를 통해 값이 세팅되었지만, 
            // handler가 현재 할당되지 않은 상태라 nil로 평가됨
            self.handler?(self.value)
        }
    }

    init(_ value: T) {
        // 1. Observable 인스턴스 멤버 변수 value에 값이 들어오면서 타입이 결정된다.
        self.value = value 
    }

    // 3. Observable 인스턴스로 bind 메서드를 호출
    // => 첫 인자로 들어온 값을 클로저 구현부의 로직에 맞게 핸들링
    // => 그 핸들링한 로직을 앞으로의 handler 클로저에 맵핑함
    func bind(_ value: T, handler: @escaping (T) -> ()) {
        handler(value)
        self.handler = handler 
        // 4. vlaue의 값이 바뀌면(->didSet 활성화), 
        // 여기서 맵핑된 클로저 로직이 자연스럽게 돌아감
    }
}