RxSwift Trait
(스터디하면서 공부한 자료를 정리하였습니다)
RxSwift에는 여러가지 trait들이 있는데요,
간혹 인터넷에서 RxSwift자료를 찾다보면 예시로 보통 Observable과 BehaviorSubject로 나옵니다.
저는 거기에 대한 의문점을 가지게 되었습니다.
왜 꼭 Observable과 BehaviorSubject만 사용을 해야할까?
다른 trait들을 사용할수는 없었을까?
(=그것이 최선이었을까?)
이런 의문점이 생겨서, trait들을 찾아보았습니다.
RxSwift에서 사용되는 trait들은 이정도가 있더라구요.
RxSwift
Observable
Single
Completable
Maybe
Infallible
RxCocoa
Driver
Signal
Subject
PublishSubject
BehaviorSubject
ReplaySubject
AsyncSubject
하나하나 간략하게 정리해보려고 합니다.
먼저 기본적으로, RxSwift는 크게 RxSwift와 RxCocoa 두가지로 나뉘어 분류됩니다.
공부를 하면서 찾아보니, 크게 RxCocoa를 따로 만든 이유는 UI에관한 제어가 있지만,
근본적으로 Swift 언어 자체가 apple제품군에서가 아닌, 여러가지 OS에서 사용될수가 있습니다.
RxCocoa는 UI 제어를 떠나서, apple제품군들의 프로그래밍을 할때 사용된다고 보는게 정확합니다.
(UIKit, NSKit등)
RxSwift
Observable
(이후 설명을 대부분 Observable을 기반으로 설명합니다.)
데이터를 퍼블리싱하는 ReactiveX의 가장 기본적인 시퀀스입니다.
대표적으로 세가지의 이벤트가 있습니다.
next
Observable은 N번의 요소를 방출할수 있습니다.
complete
모든 요소들이 방출된 후 방출되는 이벤트입니다. 이 이벤트를 보낸 후에는 Dispose됩니다.
error
요소에대한 처리를 하던 도중 오류가 나올시 방출합니다. 이 이벤트를 보낸 후에는 Dispose됩니다.
Single
Observable과 다르게, 한번만 요소를 방출하는 시퀀스입니다.
success
Observable에서 next와 complete의 합성이라고 생각하면 될 것 같습니다.
딱 한번 요소를 방출한 후 Dispose됩니다.
error
똑같이 요소에 대한 처리를 하던 도중 오류가 생기면 방출됩니다. 똑같이 방출 후에는 Dispose됩니다.
Completable
Single과 같이 한번 방출되지만, 요소가 방출되지는 않습니다.
complete
완료의 의미로 방출이 되며, 요소를 보내주지는 않습니다. 방출 후에는 Dispose 됩니다.
error
Maybe
Completable과 Single의 중간쯤으로 생각하면 됩니다.
딱 한번 요소를 방출하는데, 요소가 들어올수도, 들어오지 않을수도 있습니다.
success
요소를 방출 후 Dispose합니다.
complete
요소를 방출하지 않고 Dispose합니다.
error
Infallible
RxSwift6부터 사용되는 Trait입니다.
error를 방출하지 않습니다.
next
Observable과 똑같이 N번의 요소를 방출합니다.
complete
요소를 전부다 방출한 후 Dispose 합니다.
이렇게만 놓고보면 아래 RxCocoa의 Driver 혹은 Signal과 비슷할수도 있는데요, 몇가지 차이점이 있습니다.
* RxCocoa가 아닌 RxSwift API의 Trait입니다.
* MainScheduler를 사용하지 않습니다. 즉 UI전용 Trait이 아닙니다.
* share 메소드를 기본적으로 사용하지 않습니다.
RxCocoa
Driver
* 일종의 UI를 위한 Observable로, complete와 error가 없습니다.
Mainscheduler를 사용하며, 항상 share 메소드가 따라옵니다.
drive
Observable의 next와 똑같은 역할을 합니다.
share?
여기서 짚고 넘어가야할 부분인데요, Cold Observable들은 구독시점에 데이터가 생성되어 연산, 방출을 하게됩니다.
그렇기에 구독을 할때마다 매번 함수들이 작동하고, 필요하다면 객체가 생성이 되겠죠.
그런데 NetworkAPI를 호출하는 경우에.. 필요 이상으로 API를 호출하면 리소스 소모가 상당할것입니다.
그런 부분들을 방지하기 위하여 share라는 함수를 사용합니다.
share는 말 그대로 Observable의 데이터를 공유하기위한 함수입니다.
기본 인자 형태는 share(replay: 1, scope: .whileConnected)로 되어있습니다.
replay
해당 Observable의 버퍼의 크기로, 쉽게 말해 공유할 요소의 수 입니다.
scope: 유지할 방식입니다.
- whileConnected: 하나라도 연결되어있다면, 버퍼가 유지되도록 하는 방식입니다.
- forever: 한번이라도 버퍼가 생성되었었다면, 버퍼가 유지되도록 하는 방식입니다.
Signal
Driver의 변형으로, Driver과 똑같지만, 새로운 구독자에게 replay를 해주지 않습니다.
(즉 기존의 값을 전달해주지는 않습니다)
emit
Driver의 drive와 똑같습니다.
Subject
Observable의 구현체로써, 데이터를 저장할 수 있습니다.
요소를 보낼수도, 구독할수도 있습니다.
PublishSubject
구독 이후 요소들을 방출하는 가장 기본적인 형태의 Subject입니다.
BehaviorSubject
구독시점에서 가장 마지막으로 방출되었던 값을 초기값으로 방출하는 Subject입니다.
ReplaySubject
배출되었었던 항목들을 새로운 구독자에게 방출하는 Subject입니다.
몇가지 생성자 오버로딩이 되어있어, 버퍼크기를 관리할 수 있습니다.
다만 ReactiveX 공식 홈페이지에서는, 멀티스레드 환경에서 어떤 항목을 먼저 처리할지에 대한 모호함이 발생할수 있기 때문에, 구독 객체가 생긴 이후에는 next로 요소를 방출하는것을 권장하지 않는다고 합니다.
AsyncSubject
complete 이벤트를 실행한 이후, 마지막 값 하나만을 방출하는 Subject입니다.
Relay
Relay들은 Driver와 비슷한 특성을 가진 Subject로 보시면 됩니다.
complete와, error가 없습니다.
complete가 없으므로, AsyncRelay는 없으며, 세가지로만 구성되어 있습니다.
PublishRelay
BehaviorRelay
ReplayRelay
여기까지가 RxSwift의 Trait 정리입니다.
Subject부분은 자세하게 설명하기에는 너무 방대하여(...) 더 자세한 설명을 원하시면 공식홈페이지 문서를 참조하시면 될 것 같습니다..
간단하게 표로 정리 해 보았습니다.
이름 | 이벤트 | share | scheduler | ||
next | complete | error | |||
Observable | O | O | O | X | Any |
Single | O(1) | X | O | X | Any |
Completable | X | O | O | O | Any |
Maybe | O(1) | O | O | X | Any |
Infallible | O | O | X | X | Any |
Driver | O | O | X | O | Main |
Signal | O | O | X | O | Main |
PublishSubject | O | O | O | X | Any |
BehaviorSubject | O | O | O | X | Any |
ReplaySubject | O | O | O | X | Any |
AsyncSubject | O | O | O | X | Any |
PublishRelay | O | X | X | O | Any |
BehaviorRelay | O | X | X | O | Any |
ReplayRelay | O | X | X | O | Any |
댓글
이 글 공유하기
다른 글
-
RxSwift 결합 함수 정리
RxSwift 결합 함수 정리
2021.07.04 -
addSubview 한번에 하기
addSubview 한번에 하기
2021.06.03 -
Playground로 RxSwift 공부하기.
Playground로 RxSwift 공부하기.
2021.05.21 -
배열의 오버플로우, 언더플로우를 방지하는 방법.
배열의 오버플로우, 언더플로우를 방지하는 방법.
2021.05.10