[RxSwift] 곰튀김님의 RxSwift 강의 (2)
이전 글 [RxSwift] 곰튀김님의 RxSwift 강의 (1)
Subject
만들 때 부터 어떤 데이터를 내보낼지 정해져있다.
Observable처럼 값을 받을 수도 있지만 (subscribe)
외부에서 값을 통제할 수도 있다. (onNext)
AsyncSubject
completed 되는 시점에 subscribe한 애들한테 가장 마지막 값을 보내준다.
BehaviorSubject
초기값을 가지고 있어서 subscribe할 때 초기값을 보내준다. 그 후 추가로 생기는 subscribe은 가장 최근의 값을 초기값으로 보내준다.
PublishSubject
초기값 없이 subscribe 후 값이 들어오면 그대로 보내준다.
추가로 생기는 subscribe도 같다.
ReplaySubject
첫 번째 subscribe은 PublishSubject와 같지만 두 번째 subscribe부터는 이전에 있었던 값들을 한번에 보내준다.
가장 많이 쓰는 Subject는 Publish와 Behavior이다.
RxCocoa
RxCocoa는 RxSwift 요소들을 UIKit View들에게 extension으로 적용해놓은 것이다.
// UILabel
label.rx.text // Binder 타입 bind 시킬 수 있다.
UI와 관련된 작업을 처리하기 때문에 항상 Main Thread에서 동작해야한다.
viewModel.itemsCount
.map { "\\($0)" }
.observeOn(MainScheduler.instance)
.bind(to: itemCountLabel.rx.text)
.disposed(by: disposeBag)
observeOn으로 MainScheduler로 설정해줘야한다.
viewModel.itemsCount
.map { "\\($0)" }
.catchErrorJustReturn("")
.observeOn(MainScheduler.instance)
.bind(to: itemCountLabel.rx.text)
.disposed(by: disposeBag)
UI와 관련된 것이기 때문에 에러처리가 필요하다.
catchErrorJustReturn으로 에러가 발생하면 빈 문자열을 보내게 하는 것도 가능하다.
observeOn과 catchErrorJustReturn의 처리는 항상 필요하다.
viewModel.itemsCount
.map { "\\($0)" }
.asDriver(onErrorJustReturn: "")
.drive(itemCountLabel.rx.text)
.disposed(by: disposeBag)
항상 UI Thread(Main Thread)에서 동작하는 Driver로 처리할 수 있다.
Relay
Relay는 에러가나도 끊어지지 않는 Subject이다.
Reley는 onNext대신 accept를 사용한다.
// Subject
self.menuObservable.onNext($0)
// Relay
self.menuObservable.accept($0)
MVVM
화면에 어떤 내용을 그려야할지 ViewModel에서 가지고 처리하고 View에서는 아무런 처리를 하지 않고 화면에 가지고있는 것과 이벤트만 넘겨준다.
모든 동작과 데이터 처리는 ViewModel에서 진행한다.