RxSwift는 세가지 Relays를 제공한다.
PublishRelay
서브젝트와 유사한 특징을 가지고 있고 내부에 서브젝트를 래핑하고있다.
PublishRelay는 PublishSubject를 래핑하고 있다
BehaviorRelay
BehaviorRelay는 BehaviorSubject를 래핑하고있다
ReplayRelay
ReplayRelay는 ReplayRelay를 래핑하고 있다.
Relay는 서브젝트와 마찬가지로 다른소스로부터 이벤트를 받아서 구독자로 전달한다.
가장 큰 차이는 NextEvent만 전달한다는것이다. CompleteEvent와 ErrorEvent는 전달 받지도 않고 전달하지도 않는다.
그래서 앞에서 공부한 서브젝트와 달리 종료되지 않는다.
구독자가 disposed되기 전까지 계속 이벤트를 처리한다. 그래서 주로 UIEvent처리에 활용된다.
Relay는 RxSwift가 아닌 Rxcocoa프레임워크를 통해 제공된다.
PublishRelay
let prelay = PublishRelay<Int>()
//빈 생성자로 생성한다는 것은 PublishSubject와 동일하다
let prelay = PublishRelay<Int>()
//빈 생성자로 생성한다는 것은 PublishSubject와 동일하다
prelay
.subscribe{print("1: \($0)")}
.disposed(by: bag)
prelay.accept(1)
//1: next(1)
Relay는 onnext메서드를 사용하지 않는다 accept메서드를 사용한다.
BehaviorRelay
let brelay = BehaviorRelay<Int>(value: 1)
brelay.accept(2)
brelay.subscribe{
print("2: \($0)")
}
.disposed(by: bag)
//2: next(2)
BehaviorSubject와 마찬가지로 하나의 생성자를 갖는다.
바로 accept를 사용해 이벤트를 보내면 생성자로 전달된 이벤트가 변경된다.
let brelay = BehaviorRelay<Int>(value: 1)
brelay.accept(2)
brelay.subscribe{
print("2: \($0)")
}
.disposed(by: bag)
brelay.accept(3)
//2: next(2)
//2: next(3)
바로 accept로 3을 전달하면 즉시 구독자에게 3이 전달된다.
BehavioRelay는 value라는 속성을 제공한다.
이속성은 릴레이가 저장하고있는 NextEvent에 접근해서 여기에 저장되어 있는 값을 return한다.
print(brelay.value)
//3
이 속성은 읽기 전용이고 저장되어있는 값을 바꾸진 못한다.
새로운 값으로 바꾸고 싶다면 accept메서드를 통해 새로운 NextEvent를 전달해야한다.
ReplayRelay
let rrelay = ReplayRelay<Int>.create(bufferSize: 3)
(1...10).forEach{
rrelay.accept($0)
}
rrelay.subscribe{ print("3: \($0)")}
//3: next(8)
//3: next(9)
//3: next(10)
ReplaySubject와 마찬가지로 create메서드를 통해 생성하고 버퍼의 사이즈를 전달한다.