Tunko Development Diary

RxSwift) Relay (RxSwift 6) 본문

Development/RxSwift

RxSwift) Relay (RxSwift 6)

Tunko 2022. 5. 30. 19:23

PublishRelay 는 PublishSubject를 wrapping

BehaviorRelay 는 BehaviorRelay를 wrapping

ReplayRelay 는 ReplaySubject를 wrapping 합니다.

ReplayRelay는 RxSwift6 버전에서 추가 되었습니다.

여기서 wrapping은 감싸다 라는 사전적 의미입니다.

기존 사용되는 방법에서 추가하거나 기능을 제외시키거나 할대 사용되는 프로그래밍 방식입니다.

 

Subject를 wrapping하면서 Relay가 된 기능의 대표적인 차이점은

Completed, Error 이벤트를 방출하지 않는다는 것입니다.

 

종료 되지 않기때문에 주로 UI이벤트를 처리할때 사용합니다.

Relay는 UI이벤트를 처리할때 사용한다 했듯이 RxCocoa 라이브러리를 통해 제공됩니다.

Relay는 Subject와 다르게 .accept 메서도를 통해 이벤트를 전달합니다.

PublishRelay 사용 예

import UIKit
import RxSwift
**import RxCocoa**

let bag = DisposeBag()

let publishRelay = PublishRelay<Int>()
publishRelay.subscribe { print("PublishRelay: \\($0)")}
    .disposed(by: bag)

publishRelay.accept(1)

출력

PublishRelay: next(1)

위에 이야기한것처럼 next 이벤트만 오는것 외에는 PublishSubject랑 다르지 않습니다.

BehaviorRelay 사용 예

let behaviorRelay = BehaviorRelay(value: 1)
behaviorRelay.accept(2)
behaviorRelay.subscribe {print("BehaviorRelay: \\($0)")}
    .disposed(by: bag)
// 출력 2: next(2)
// 가장 최근 accept이벤트 인자가 들어온다
behaviorRelay.accept(3)

print(behaviorRelay.value)

출력

BehaviorRelay: next(2)
BehaviorRelay: next(3)
3

BehaviorRelay는 value(only read) 속성도 제공됩니다. value값을 바꾸고 싶다면 새로운 accept 값을 전달해야 합니다.

ReplayRelay 사용 예

let replayRelay = ReplayRelay<Int>.create(bufferSize: 3)
(1...10).forEach{
    replayRelay.accept($0)
}
replayRelay.subscribe{print("ReplayRelay: \\($0)")}
    .disposed(by: bag)

출력

ReplayRelay: next(8)
ReplayRelay: next(9)
ReplayRelay: next(10)

ReplaySubject 와 같이 create를 통해서 버퍼크기를 정해서 생성합니다.

버퍼에 마지막에 들어온 이벤트 만큼 구독과 동시에 호출됩니다.

반응형
Comments