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
'iOS의 모든것' 카테고리의 다른 글
[iOS의 모든것] 자주 쓰는 코코아팟 명령어 (0) | 2021.04.07 |
---|---|
[iOS의 모든것] 애플 개발자 계정 등록 (1) | 2021.04.05 |
[iOS의 모든것] RxSwift - Observable 생성 연산자 (0) | 2020.12.27 |
[iOS의 모든것] Xcode Project path 한글 (0) | 2020.12.07 |
[iOS의 모든것] Navigation Bar 감추기 (0) | 2020.02.01 |