본문 바로가기

TIL

[TIL] RxSwift 간단 요약 정리

Observable VS Observer

Observable

  • 이벤트를 생성 및 방출

Observer

  • 이벤트를 처리

Subscribe

  • Observable과 Observer 사이를 연결하여  Stream(데이터 흐름)을 생성

Subject

  • 등장 배경
    • Observable은 이벤트 방출만 할 수 있고, 이벤트에 대한 처리를 하지 못함
    • 따라서 Observable과 Observer 역할을 모두 수행할 수 있는 Subject가 등장
  • 종류
    • PublishSubject, BehaviorSubject, ReplaySubject, AsyncSubject
    • 이중 PublishSubject, BehaviorSubject가 주로 사용된다.

PublishSubject

  • 초기값이 없는 빈 상태로 시작
  • 구독(Subcribe) 이후 시점부터 emit 되는 이벤트를 처리할 수 있는 특서을 가지고 있음
  • 구독(Subcribe) 이전에 emit된 이벤트들은 무시

BehaviorSubject

  • 초기값 필수 (PublishSubject와의 차이점)
  • 구독(Subscribe) 이전에 방출(emit)한 이벤트가 있다면, 가장 최근에 전달된 이벤트 하나를 전달
  • 구독(Subscribe) 이전에 방출(emit)한 이벤트가 없다면 초기값 전달
  • 뷰를 미리 채워두는데 용이

Relay

  • Subject와 거의 유사한 특성을 가지고 있음
  • Subject와 가장 큰 차이는 Completed와 Error 이벤트가 없음
  • 따라서 Relay는 UI 용도로 많이 사용됨
    • 왜냐하면 UI가 Completed와 Error 이벤트를 받게 된다면 더 이상 next 이벤트를 전달받을 수 없게 되고 그렇다면 반응형의 장점이 사라지기 때문
    • Completed나 Error 이벤트를 받고 나면 disposed 상태가 되는데, Relay는 Completed나 Error 이벤트를 받지 못하니 disposed가 호출되는 deinit 시점이나 직접 처리를 해주어야 합니다.
    • 그래서 Relay는 next 이벤트만 처리
    • Relay는 next 이벤트를 accept 라는 키워드로 대체
  • 종류
    • PublishRelay, BehaviorRelay 등이 있다.
    • 위 두 Relay가 주로 사용됨

정리

Name next error complete
Observable O O O
PublishSubject O O O
BehaviorSubject O O O
PublishSubject O X X
BehaviorRelay O X X

Driver

  • 메인 스레드에서 실행 보장
  • UI에 특화된 Observable, 구독(Subscribe)만 할 수 있고 값을 변경할 수 없음
  • Driver는 구독(Subscribe)의 의미를 drive로 표현
  • bind와 달리 스트림(Stream) 공유가 됨
    • drive는 내부적으로 share(replay:1, scope: .whileConnected)로 구현