Binding

DataProducer는 데이터를 생성하고 DataConsumer는 데이터를 수신하여 Binding 한다. 앱을 만드는 관점에서 볼때 Binding은 DataProducer 즉 Observable이 방출한 이벤트를 UI에 적절하게 데이터를 바인딩 하는것을 의미한다.

Untitled

Binder는 Observer에 해당하고 데이터를 방출하는 Observable이 아닌 Observer 이기때문에 이벤트를 방출하지 않는다.

textField에 입력된 값을 UILabel에 표시할때 textField의 값의 변화를 구독하여 값을 바인딩 해줄 수 있다. 이러한 방법은 문제가 되지는 않지만 아래의 문제가 발생할 여지가 있다.

이러한 문제들을 방지하기 위해서 bind(to:) 메서드를 이용하여 메인스레드에서 동작을 보장하면서 약한 참조를 처리하지 않고 바인딩을 할 수 있다.

        valueField.rx.text //  ControlProperty<String?> 리턴(옵저버블)
            .subscribe { [weak self]  str in
                self?.valueLabel.text = str
            }
            .disposed(by: disposeBag)

valueField.rx.text는 ControlProperty<String?>을 리턴한다. ControlProperty는 이벤트 방출과 구독이 가능한 특별한 타입이다.

   valueField.rx.text //  ControlProperty<String?> 리턴(옵저버블)
            .bind(to: valueLabel.rx.text)
            .disposed(by: disposeBag)

Observable+Bind.swift

  public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element {
        self.subscribe { event in
            observers.forEach { $0.on(event) }
        }
    }

bind 메서드는 Observer 타입을 파라미터로 받는다.

스크린샷 2024-06-25 오후 3.17.04.png

Binder<String?>은 String을 받는 ObserverType이다.