[RxSwift] 5-1. Relay 종류

6863 단어 rxswiftrxswift

RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀


Relay 종류

Relay에는 PublishRelay, BehaviorRelay, ReplayRelay 가 있다.
이중 ReplayRelay 는 RxSwift6 에서 추가가 되었다.

relay는 subject를 wrapping 한거라, 주된 동작방식은 비슷하다.
다만 가장 큰 차이점은 completed, error 이벤트를 전달 하지도 받지도 않는다는 점이다.

RxCocoa

relay가 dispose 전까지 종료가 되지 않는 다는 점에서 UI event에 적합하다.
따라서 UIKit 에도 쓸 수 있는 RxCocoa를 import 해줘야 relay를 사용할 수 있다.

Code

이제 코드로 구현해보겠다.
전체코드는 깃허브 에서 확인 가능하다.

PublishRelay

let pl = PublishRelay<String>()
pl.subscribe { print("PublishRelay o1 : \($0)")}
.disposed(by: disposeBag)

pl.accept("a")

PublishSubject는 구독 이후 받은 이벤트를 전달했었다.
마찬가지로 PublishRelay도 구독이후 이벤트를 전달받는다.
따라서 a 이벤트를 전달받아, output은 PublishRelay o1 : next(a) 가 된다.

BehaviorRelay

let bl = BehaviorRelay<String>(value: "a")
bl.accept("b")
bl.subscribe { print("BehaviorRelay o1 : \($0)")}
.disposed(by: disposeBag)
print("BehaviorRelay는 value를 통해 값도 꺼낼수 있다구 : \(bl.value)")

역시, BehaviorSubject 처럼 초기값을 가지고 생성이 된다.
따라서, a를 가지고 생성이되고, b를 발행하게 된다음 구독을 했으므로, 가장 최신이벤트인 b를 전달 받게 된다.

이때, BehaviorRelay의 특징이 하나 있다.
아래 definition을 보면 , value를 통해 현재 값을 뽑아 줄 수 있다.

따라서 bl.value 를 통해 next(b)에서 "b" 를 가져올 수 있다.

ReplayRelay

let rl = ReplayRelay<String>.create(bufferSize: 3)
arr.forEach { rl.accept($0) }
rl.subscribe { print("ReplayRelay o1 : \($0)")}
.disposed(by: disposeBag)

마지막으로 RxSwift6에서 추가된 ReplayRelay에 대해 정리하겠다.
역시나 ReplaySubject 처럼 bufferSize만큼 최신이벤트를 전달한다.
따라서, 아래와 같이 output 이 나온다.

output : 
ReplayRelay o1 : next(c)
ReplayRelay o1 : next(d)
ReplayRelay o1 : next(e)

subject 와 relay에 대해 지금까지 공부하고 정리해보았다.

다음번엔, Observable을 통해 들어온 이벤트를 다룰 수 있는 operator에 대해 정리해보겠다.

좋은 웹페이지 즐겨찾기