티스토리 뷰
[RxSwift] PublishSubject, BehaviorSubject, ReplaySubject, PublishRelay , BehaviorRelay
Kim_Baechu 2020. 12. 23. 11:58Subject와 Relay
Subject는 Observable이면서 Observer일 수 있습니다.
데이터를 방출하고(emit) 읽을(subscribe) 수 있습니다.
Relay는 RxCocoa를 import해서 씁니다.
cocoa가 붙은 것으로 알 수 있듯이 UI를 위해 만들어졌습니다.
Relay는 error와 complete가 없고 dispose할 때까지 종료되지 않습니다..
UI 이벤트를 처리하기 때문입니다.
PublishSubject
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject.onNext("1")
subject.subscribe { event in
print(event)
}
subject.onNext("2")
subject.onNext("3")
subject.onCompleted()
subject.onNext("4")
//next(2)
//next(3)
//completed
PublishSubject는 subscribe한 이후 부터 발생하는 이벤트를 처리합니다.
BehaviorSubject
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "Initial Value")
subject.onNext("0")
subject.onNext("1")
subject.subscribe {event in
print(event)
}
subject.onNext("2")
subject.onNext("3")
//next(1)
//next(2)
//next(3)
BehaviorSubject는 초기값을 가집니다.
ReplaySubject
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
subject.subscribe {
print($0)
}
subject.onNext("4")
subject.onNext("5")
subject.onNext("6")
print("Subscribe 2")
subject.subscribe{
print($0)
}
//next(2)
//next(3)
//next(4)
//next(5)
//next(6)
//Subscribe 2
//next(5)
//next(6)
ReplaySubject는 bufferSize만큼의 이벤트를 저장하고 있을 수 있습니다.
처음 구독하기 직전 2개의 값인 2,3을 가지고 있고 구독 후에 4, 5, 6을 처리하고 다시 구독을하면 직전 값인 5, 6을 처리합니다.
PublishRelay
let disposeBag = DisposeBag()
let relay = PublishRelay<String>()
relay.accept("1")
relay.subscribe { event in
print(event)
}
relay.accept("2")
relay.accept("3")
//next(2)
//next(3)
PulishRelay는 PublishSubject의 Wrapper 클래스입니다.
따라서 구독 이후의 이벤트를 처리합니다.
.completed나 .error 이벤트를 추가할 수 없습니다.
BehaviorRelay
let disposeBag = DisposeBag()
let relay = BehaviorRelay(value: "1")
relay.asObservable()
.subscribe{
print($0)
}
relay.accept("2")
//next(1)
//next(2)
BehaviorRelay는 BehaviorSubject의 Wrapper 클래스입니다.
BehaviorRelay은 Variable이 Drprecated되고 새로 나왔습니다.
BehaviorRelay는 value property를 가지고 있습니다.
.accept를 이용해서 값을 변경할 수 있습니다.
.completed나 .error 이벤트를 추가할 수 없습니다.
기존 값을 유지하면서 새로운 값을 추가해주고 싶을 때는 다음과 같이 합니다.
let relay = BehaviorRelay(value: ["1"])
var value = relay.value
value.append("2")
value.append("3")
relay.accept(value)
relay.asObservable()
.subscribe {
print($0)
}
//next(["1", "2", "3"])
혹은
let relay = BehaviorRelay(value: ["1"])
relay.accept(relay.value + ["2"])
relay.asObservable()
.subscribe {
print($0)
}
//next(["1", "2"])
'Swift' 카테고리의 다른 글
[Swift] Swift 언어의 특징 (0) | 2021.05.01 |
---|---|
[Swift] Delegation이란? (0) | 2021.04.09 |
[Swift] @escaping closure, 탈출 클로저 쉽게 이해하기 (0) | 2021.01.22 |
[RxSwift] toArray, map, flatMap, flatMapLatest (0) | 2020.12.23 |
[RxSwift] Observable, just, of, from (0) | 2020.12.23 |