Sign In
한결
Status
Empty
Assignee
Empty
RXSwift 기본
RX의 기본 컨셉은 우리가 작성한 코드가 앱 안에서 기본적으로 라인바이라인으로 동작하는 것이 아니다에 있다.
💬
ReactiveX, many instructions may execute in parallel and their results are later captured, in arbitrary order, by “observers.”
RX의 컨셉에 따라, 앱 전반적인 동작 상태에서 아래의 과정이 병렬적으로( ~= 비동기적으로) 진행되고, Observer에 의해 연산된 결과가 뷰에 전달된다.
Observable에 맡겨둔 이벤트가 감지되면
Observer에 등록해둔 연산(어떤 로직)이 Stream에 따라 동작하여
결과를 전달한다.
Observable과 Observer의 관계는 기본적으로 subscribe라고 하는 구독 여부에 의해 형성된다.
Observable에 연결된 Observer가 없다면, 이벤트 감지에 따른 어떤 스트림도 발생하지 않기에 Observer 구독이 시작된 시점부터 이벤트에 대한 적절한 처리가 진행될 것이다.
물론 구독 관계가 형성되어 있다가 관계를 끊는 unsubscribe 과정도 진행할 수 있다.
구독 관계는 Observable의 메서드를 통해 형성된다.
onNext: 이벤트를 단계적으로 인식시킨다. emit(배출)된 이벤트마다 해당 메서드가 동작된다.
onCompleted: 이벤트에 대한 처리를 성공적으로 처리한 상태에 호출된다. 모든 onNext 처리가 된 다음 마지막으로 실행된다.
onError: onNext로 인지된 이벤트 처리 도중에 에러가 발생할 경우 호출된다. 에러가 탐지된 경우, onCompleted도 동작하지 않는다.
onCompleted, onError는 당연하겠지만 동시에 호출될 수 없다. 이벤트 구독에 따른 스트림 처리 결과는 성공 / 실패 뿐인 것이다.
Observable이 deinit 되는 시점, 스트림이 종료되는 시점에 Dispose된다.
물론, UI단에서 버튼의 터치가 종료되는(?) 상황은 없기 때문에 dispose가 되지 않는 이런 경우도 있다.
기본적으로 RX를 Swift에 다룬다고 할 때 신경써야 할 것은,
1.
Observable에 어떤 이벤트를 각인시키고,
2.
이벤트를 처리하여 결과를 보여줄 Observer 대상은 누구인지를 잘 결정하는 것이다.
3.
Observable의 구독은 결국 Disposable(= 구독을 중지할 수 있는 가능성을 가진 프로토콜)을 반환하기 때문에, 더 이상 구독이 필요없는 이벤트를 위해 메모리를 힘들게 할 필요는 없다. 적절한 구독 해지를 도와줄 disposeBag을 잘 활용하자.
func fieldHandler() { textField.rx.value // textField라는 Observable에 value 이벤트를 주고 .bind(to: label.rx.text) // textField의 텍스트를 보여줄 Observer를 지정해서 바인딩 .disposed(by: disposebag) }
👍