# Untitled

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 값 변경 후 반환**

```javascript
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 활성화), 
        // 여기서 맵핑된 클로저 로직이 자연스럽게 돌아감
    }
}
```

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
