Sign In
한결
Status
Empty
Assignee
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 활성화), // 여기서 맵핑된 클로저 로직이 자연스럽게 돌아감 } }
👍