43_Login, Lotto Examples(Observable+MVVM)

2022. 10. 25. 22:58SeSAC/수업정리

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클래스 구성: 초기화할 프로퍼티, 클로저 메서드, 클로저 받을 프로퍼티(값변경시 자동실행에 사용)