43_Login, Lotto Examples(Observable+MVVM)
2022. 10. 25. 22:58ㆍSeSAC/수업정리
Observable타입의 값을 변경했을 때 Observable에 저장된 메서드가 자동실행되는 구조를 정리해본다.
class LoginViewModel {
var name: Observable<String> = Observable("") //반응형으로 타입설정
}
-. 뷰모델에 Observable로 초기화된 name프로퍼티
viewModel.name.bind { text in
self.nameTextField.text = text
}
-. viewModel의 name프로퍼티를 통해 Observable클래스의 bind메서드를 실행하면 bind에서 클로저로 받은 값을 사용
-. name프로퍼티 값이 바뀔때마다 bind가 실행되는 이유?
-> bind메서드에서 listener에 클로저를 저장했고 그것을 value에 대한 didSet구문으로 넣어놨기 때문. 만약 listenerd에 저장안해놨으면 처음 초기화할때만 실행되고 값변경시에는 실행 안 될 것임.
class Observable<T> { //양방향 바인딩
private var listener: ((T) -> Void)?
//bind가 가진 클로저가 listener에 저장되었기 때문에 didSet에 의해 value가 바뀔때마다 listener도 실행된다. 그렇기 때문에 값이 변경될때마다 연산처리 할 수 있음.
var value: T {
didSet {
print("didSet", value)
listener?(value)
}
}
init(_ value: T) {
self.value = value
}
func bind(_ closure: @escaping (T) -> Void) {
print(#function)
closure(value)
listener = closure //bind의 클로저와 타입이 같기 때문에 클로저 대입 가능((T) -> Void)
}
}
-. Observable클래스 구성: 초기화할 프로퍼티, 클로저 메서드, 클로저 받을 프로퍼티(값변경시 자동실행에 사용)
'SeSAC > 수업정리' 카테고리의 다른 글
083_Network(signup, login) (0) | 2022.11.02 |
---|---|
082_Rx(Input, Output)+MVVM (0) | 2022.11.01 |
074_MVVM+DiffableDataSource(숫자입력, 검색이미지) (0) | 2022.10.21 |
072_UICollectionLayoutListConfiguration(테이블뷰스타일 컬렉션뷰) (0) | 2022.10.18 |
032_for-in, foreach 알아보기 (0) | 2022.08.17 |