글 작성자: HEROHJK

 

(스터디하면서 공부한 자료를 정리하였습니다)

 

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

 

반응형