RxSwift를 학습하다보니 새로운 단어들이 너무 많아서 머릿속에서 정리가 잘 안됐었다.
RxSwift의 개념이나, 더 정리할 내용이 있는 단어에 대해선 필요하다면 별도의 글을 작성하고,
이번 글에서는 RxSwift의 핵심적인 단어들을 중심으로 한눈에 정리해보겠다.
Observable과 Observaer
- `Observable`
- 이벤트를 발생시키는 역할
- 버튼을 탭하거나, 텍스트필드에 텍스트를 작성하는 등의 행위
- `Observer`
- 구독이라는 행위로 `Observable`을 계속 관찰하고 있음
- `Observable`을 통해 신호를 받으면 즉, 이벤트가 전달되면 해당 이벤트를 처리하는 역할
- 버튼을 눌렀을 때 화면 전환이 되도록 이벤트를 처리하는 등의 행위
Observaer의 이벤트 처리방식(onNext, onCompleted, onError)
- `onNext`
- 최신 데이터 전달 ➡ 이벤트 방출(Emit)
- `onCompleted`
- 이벤트 전달 완료 ➡ 완료 알림(Notification)
- `onError`
- 이벤트 전달 과정에서 에러 발생 ➡ 에러 알림(Notification)
구독 관련 용어 (subscribe, bind, drive, dispose)
- `subscribe`
- Next, Completed, Error이벤트 전부를 처리할 수 있는 구독 방식
- 모든 이벤트를 다룰 수 있다는 점에서, `Subject`와 함께 쓰임
- `bind`
- Next이벤트만 처리할 수 있는 구독 방식
- Next이벤트만 다룰 수 있다는 점에서 `Relay`와 함께 쓰임
- `drive`
- Next이벤트만 처리할 수 있는 구독 방식
- 메인쓰레드에서의 실행을 보장 ➡ UI와 관련된 동작을 `drive`로 처리
- 하나의 스트림을 공유한다는 특징이 있음 ➡ 기존의 `share()` 오퍼레이터를 사용하지 않아도 됨
- Next이벤트만 다룰 수 있다는 점에서 `Relay`와 함께 쓰임
- `asDriver`: `Observable`을 `Driver`타입으로 변경
- `asDriver(onError...)`: `PublishRelay`를 `Driver`타입으로 변경하는 경우, 에러가 발생했을 경우 표시할 값이 없기 때문에 매개변수로 에러가 발생했을 경우의 기본값을 지정해줌
- `asDriver()`: `BehaviorRelay`를 `Driver`타입으로 변경하는 경우, 기본값이 있기 때문에 별도의 매개변수를 쓰지 않음
- `dispose`
- `Observable`이 방출하는 이벤트를 받고싶지 않을 때, 구독을 취소하는 역할
- 이벤트가 더이상 방출되면 안되는 시점에 메모리 누수를 방지하기 위함
Subject와 Relay
- `Subject`와 `Relay`
- `Observable`과 `Observer`의 역할을 모두 할 수 있는 역할
- 즉, 이벤트를 발생하는 행위와 이벤트를 처리하는 행위를 모두 할 수 있음
- `Subject`
- 옵저버로써 Next, Completed, Error이벤트 전부를 받을 수 있음
- 이러한 특징 때문에 `subscribe`와 함께 쓰임
- `PublishSubject`: 옵저버블로써 구독이 일어나기 전에 방출된(변경된) 이벤트를 받을 수 없음 / 초기값이 없음
- `BeahviorSubject`: 옵저버블로써 구독이 일어나기 전에 가장 최근에 방출된(변경된)이벤트를 받을 수 있음 / 초기값이 있어야 함
- `Relay`
- 옵저버로써 Next이벤트만 받을 수 있음, 해당 이벤트를 `onNext` 대신 `accept`라고 칭함
- 이러한 특징 때문에 `bind`, `drive`와 함께 쓰임
- `PublishRelay`: 옵저버블로써 구독이 일어나기 전에 방출된(변경된) 이벤트를 받을 수 없음 / 초기값이 없음
- `BeahviorRelay`: 옵저버블로써 구독이 일어나기 전에 가장 최근에 방출된(변경된)이벤트를 받을 수 있음 / 초기값이 있어야 함
한 장으로 정리하기
※참고자료
'iOS > UIKit' 카테고리의 다른 글
[iOS/UIKit] debounce VS throttle (0) | 2025.02.26 |
---|---|
[iOS/UIKit] RxSwift에서의 Cell의 중첩 구독 문제 (0) | 2025.02.23 |
[iOS/UIKit] View Hierarchy 디버깅 팁 (1) | 2025.02.02 |
[iOS/UIKit] 프로젝트 트러블슈팅 (0) | 2025.01.28 |
[iOS/UIKit] @objc와 #selector - 커스텀뷰에 addTarget을 하면 안되는 이유 (0) | 2025.01.15 |