Relay도 Subject처럼 다른 Observable로부터 이벤트를 받아서 Subscriber로 전달할 수도 있다.
Observable인 동시에 Observer이다.
PublishRelay: PublishSubject Wrapping
BehaviorRelay: BehaviorSubject Wrapping
ReplayRelay: ReplaySubject Wrapping (RxSwift 6+)
- Next 이벤트만 받고 Error와 Completed 이벤트는 받지 않는다.
- 주로 종료없이 계속 전달되는 이벤트 Sequence를 처리할 때 활용한다.
Next 이벤트만 다룬다. Error와 Completed 이벤트는 전달받지도 전달하지도 않는다.
그렇기 때문에 종료되지 않는다.
Subscriber가 Dispose되기 전까지 계속 이벤트를 처리하기 때문에 주로 UIEvent 처리에 활용된다.
PublishRelay
let publishRelay = PublishRelay<Int>()
publishRelay.subscribe {
print("PublishRelay", $0)
}
.disposed(by: disposeBag)
publishRelay.accept(10)
// Output
PublishRelay next(10)
onNext 대신 accept 메소드를 사용한다.
BehaviorRelay
let behaviorRelay = BehaviorRelay(value: 100)
behaviorRelay.accept(20)
behaviorRelay.subscribe {
print("BehaviorRelay", $0)
}
.disposed(by: disposeBag)
// Output
BehaviorRelay next(20)
BehaviorSubject와 똑같이 작동하지만, Relay이기 때문에 accept 메소드를 사용한다.
behaviorRelay.accept(4)
print(behaviorRelay.value)
// Output
BehaviorRelay next(4)
4
BehaviorSubject는 value 프로퍼티를 제공한다. 마지막 Event가 가진 데이터 값을 리턴한다.
get-only 프로퍼티이며, 해당 값을 바꾸려면 accept를 사용하면된다.
ReplayRelay(RxSwift 6+)
RxSwift 6 이상부터 사용할 수 있다.
let replayRelay = ReplayRelay<Int>.create(bufferSize: 2)
[1, 2, 3, 4, 5].forEach {
replayRelay.accept($0)
}
replayRelay.subscribe {
print("ReplayRelay", $0)
}
.disposed(by: disposeBag)
// Output
ReplayRelay next(4)
ReplayRelay next(5)
ReplayRelay와 동일하게 작동한다.
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Subject - AsyncSubject (0) | 2022.09.17 |
---|---|
[RxSwift] Subject - ReplaySubject (0) | 2022.09.16 |
[RxSwift] Subject - BehaviorSubject (0) | 2022.09.15 |
[RxSwift] Subject - PublishSubject (0) | 2022.09.14 |
[RxSwift] Observable, Observer, Operators (0) | 2022.09.14 |