본문 바로가기

iOS의 모든것

[iOS의 모든것] RxSwift - Subject

1. PublishSubject
 - 가장 기본적인 Subject로써 init 시점에 아무런 값도 가지지 않는다. (subscribe가 발생되도 아무런 값을 방출하지 않음)
 - subscribe 발생 이후로부터 Observable이 방출시킨 값만을 이벤트로 전달받는다.
 - onCompleted() or onError(_:) 이벤트가 발생하면 더이상 onNext(_:)이벤트는 발생하지 않는다.

import UIKit
import RxSwift

let publishSubject = PublishSubject<String>()
publishSubject.onNext("1")
publishSubject.subscribe() { print("첫 번째 구독 \($0)") }
publishSubject.onNext("2")
publishSubject.subscribe() { print("두 번째 구독 \($0)") }
publishSubject.subscribe() { print("세 번째 구독 \($0)") }
publishSubject.onNext("3")

예제 코드에 대한 출력 결과를 예측해보세요.

더보기

첫 번째 구독 next(2)
첫 번째 구독 next(3)
두 번째 구독 next(3)
세 번째 구독 next(3)

 

2. BehaviorSubject
 - PublishSubject와 달리 생성 시점부터 값을 가지고 있다. (구독이 시작되면 가지고 있는 값을 방출)
 - subscribe가 발생하면 발생한 시점 이전에 발생한 이벤트 중 가장 최신 이벤트를 전달받는다.
 - PublishSubject와 마찬가지로 onCompleted() or onError(_:) 이벤트가 발생하면 더이상 onNext(_:)이벤트는 발생하지 않는다.

import UIKit
import RxSwift

let behaviorSubject = BehaviorSubject<String>(value: "@")
behaviorSubject.onNext("1")
behaviorSubject.subscribe() { print("첫 번째 구독 \($0)") }
behaviorSubject.onNext("2")
behaviorSubject.subscribe() { print("두 번째 구독 \($0)") }
behaviorSubject.subscribe() { print("세 번째 구독 \($0)") }
behaviorSubject.onNext("3")

예제 코드에 대한 출력 결과를 예측해보세요.

더보기

첫 번째 구독 next(1)
첫 번째 구독 next(2)
두 번째 구독 next(2)
세 번재 구독 next(2)
첫 번째 구독 next(3)
두 번째 구독 next(3)
세 번째 구독 next(3)

 

3. ReplaySubject
 - ReplaySubject는 bufferSize 를 통해 최신 이벤트로부터 몇 개의 이벤트를 저장할지 정할 수 있다.
 - 새로운 Subscribe가 발생하면 bufferSize 만큼의 이벤트를 전달하지만, 이미 구독중인 구독자에게는 최신의 이벤트만을 전달한다.

import UIKit
import RxSwift

let replaySubject = ReplaySubject<String>.create(bufferSize: 3)
replaySubject.onNext("1")
replaySubject.subscribe() { print("첫 번째 구독 \($0)") }
replaySubject.onNext("2")
replaySubject.subscribe() { print("두 번째 구독 \($0)") }
replaySubject.subscribe() { print("세 번째 구독 \($0)") }
replaySubject.onNext("3")
replaySubject.onNext("4")
replaySubject.subscribe() { print("네 번째 구독 \($0)") }

예제 코드에 대한 출력 결과를 예측해보세요.

더보기

첫 번째 구독 next(1)
첫 번째 구독 next(2)
두 번째 구독 next(1)
두 번째 구독 next(2)
세 번째 구독 next(1)
세 번째 구독 next(2)
첫 번째 구독 next(3)
두 번째 구독 next(3)
세 번째 구독 next(3)
첫 번째 구독 next(4)
두 번째 구독 next(4)
세 번째 구독 next(4)
네 번째 구독 next(2)
네 번째 구독 next(3)
네 번째 구독 next(4)

 

4. AsyncSubject
 - AsyncSubject는 completed 상태일 경우에만 마지막 이벤트를 Subscriber에게 전달한다.

import UIKit
import RxSwift

let asyncSubject = AsyncSubject<String>()
asyncSubject.onNext("1")
asyncSubject.subscribe() { print("첫 번째 구독 \($0)") }
asyncSubject.onCompleted()
asyncSubject.onNext("2")
asyncSubject.subscribe() { print("두 번째 구독 \($0)") }
asyncSubject.subscribe() { print("세 번째 구독 \($0)") }

예제 코드에 대한 출력 결과를 예측해보세요.

더보기

첫 번째 구독 next(1)
첫 번째 구독 completed
두 번째 구독 next(1)
두 번째 구독 completed
세 번째 구독 next(1)
세 번째 구독 completed