RxSwift 시작하기(Relay) - 5

DevelopRecord·2022년 7월 17일
0

RxSwift

목록 보기
5/7

오늘 알아볼 내용은 Relay입니다.

시작하기에 앞서 사전적 용어부터 볼게요.

전달하다, 중계하다

뭔가를 전달하는 역할인 것은 유추 가능하네요.
주로 UI Event들을 관찰합니다. 그러기에 UI Event에 관련된 액션들을 넣을 수가 있고요.

Relay라는 녀석은 RxSwift에서 제공하는 것이 아닌,
RxCocoa에서 제공합니다.

RxCocoa는 애플 환경의 애플리케이션을 만들 때 사용하는 Cocoa Framework와 Rx를 합친 기능을 제공합니다.

Relay는 UI Event를 처리할 때 주로 사용하기 때문에 RxCocoa를 import 해야 사용할 수 있어요.

1. PublishRelay

PublishRelay는 PublishSubject의 Wrapper 클래스입니다.
따라서 PublishSubject의 특성을 따라가기에 구독 이후에 방출되는 이벤트들만 알수 있어요.

let relay = PublishRelay<String>()
relay.subscribe { event in
	print(event)
}
relay.accept("PublishRelay 1")

큰 틀에서 보면 PublishSubject랑 구조적으로 차이라 할 게 별로 없어요.
다만 메서드가 조금 다른걸 볼 수 있는데 accept로 되어있죠?
그리고 error, complete 메서드도 없습니다.

우선 Relay를 사용하는 이유중에 하나가 UI Event를 처리할 때 사용한다고 했었죠?

예를 들어, UI와 관련된 동작(텍스트필드)을 PublishSubject로 처리한다 가정해볼게요.

하지만 사용하다가 에러가 발생하면 동작을 멈추겠죠. 사용자가 텍스트필드를 입력하는 도중이나 입력하고 나서요.

그렇게 되면 절대 안됩니다. 사용자는 사용하다 앱이 멈춰버리는 상황이 발생하니 매우 불쾌할 거고요.

따라서 error, complete가 없는 Relay를 사용해야 합니다.

그럼 Relay는 언제 종료하느냐? Dispose되기 전까지 동작합니다.

제 생각이지만 Relay에 onNext가 아닌 accept로 되어 있는 이유가 오류가 발생하면 안되니까 그냥 받아들여라 라는 의미가 아닐까 조심스레 추측해 봅니다.

2. BehaviorRelay

BehaviorRelay 역시 BehaviorSubject랑 동작 방식이 유사합니다.

기존에 Variable이라고 있었지만, Deprecated되었다고 합니다.
그래서 대신에 BehaviorRelay를 사용하시면 된다고 합니다.

BehaviorRelay는 사용시 편리한 점이 하나 있습니다.
만일 String형 배열을 가지는 BehaviorRelay가 있으면 이렇게 데이터를 처리해 줄 수 있어요.

let behaviorRelay = BehaviorRelay<[String]>(value: ["Initial", "value"])
let behaviorRelayOb = behaviorRelay.asObservable()

behaviorRelayOb.subscribe { event in
    print(event)
}

var value = behaviorRelay.value
value.append("BehaviorRelay 2")
behaviorRelay.accept(value)

BehaviorRelay 역시 error, complete가 없고 Dispose를 통해서만 종료됩니다.

생각난 김에 정리해 보면..

  1. BehaviorSubject는 초기값을 지정해야 한다.
  2. 구독 전에 방출한(onNext) 이벤트가 없으면 구독한 순간에 초기값을 출력합니다.
  3. 만일 구독 전에 방출한 이벤트가 여러개 있으면 가장 최근의 이벤트를 출력한다.

마지막으로 Subject와 Relay의 차이점은..
~Subject는 error, complete의 이벤트가 발생하면 subscribe가 종료되지만,
~Relay는 Dispose로만 종료됩니다.

따라서 Relay에서 UI Event를 처리하기 적합하다로 결론이 나네요.

배우고 정리하고 쓰느라 상당히 시간이 많이 걸리네요.
그래도 직접 쓰면서 코드를 다시 보니 이해가 한결 편합니다..ㅎㅎ

잘못된 정보, 정확하지 않은 정보 지적은 언제든 해주시면 감사하겠습니다!

참고

jinShine 블로그
Fomagran 블로그

0개의 댓글