[iOS] RxSwift(5) - Relay가 뭐야

Madeline👩🏻‍💻·2024년 7월 17일

RxSwift study

목록 보기
6/6
post-thumbnail

시간이 지날수록 가물가물해지는 Rxswift의 기억,,
얘는 진짜 특히 기능이 되게 많은 리모컨 같다,,

Relay 3줄 요약

  • UI에서 더 잘 쓰려고 만든 것이다.

(Subject의 UI 확장판 -> Relay )

  • 기능은 똑같은데, relay 키워드에 next(-> accept) 이벤트만 쓸거다!

RxSwift - Relay는 또 뭐야

Subject를 내부에서 Wrapping한 것이 Relay !!

진짜다!

PublishRelay는 내부적으로 PublishSubject를 사용한다.

PublishSubject는 이벤트를 발행하고 구독자에게 전달하는 역할을 하지??

PublishRelay는 PublishSubject를 감싸서 에러나 완료 이벤트 없이 next 이벤트만을 전달한다.

왜 쓰나?

UI Event는 구독하는 시점부터 끝나는 시점까지 종료되면 안되고 계속해서 이벤트를 감지해야 한다.

Relay는 RxSwift의 일부로, UI 이벤트를 처리할 때 사용되는 도구이다!
데이터를 안전하게 전달하고, 에러 없이 계~속 동작하도록 만들어졌따.

Subject는 completed, error 이벤트가 발생하면 구독이 종료되어버리기 떄문에,

next 이벤트만 받고, dispose되기 전까지 계속해서 작동하는 Relay가 더 UI에 특화되어있는거다!

Subject가 뭐더라? 😴
RxSwift에서 Observable이면서 Observer의 역할을 할 수 있는 상태
Next, Completed, Error 이벤트 모두 다룬다.
근데 난 Next 이벤트만 다룰건데? => Relay를 써보자!

이전 글도 참고해보자!
https://velog.io/@maddie/iOS-RxSwift3-Subject%EC%9D%98-%EB%93%B1%EC%9E%A5

Relay는 Subject의 일종으로, 특히 PublishSubject, BehaviorSubject와 같은 기능을 제공하지만,
구독자에게 현재 값을 제공할 수 있는 기능도 갖추고 있다.

특징?

1. 불변성

Subject는 onNext, onError, onCompleted 등의 메서드를 사용해서 외부에서 직접 데이터를 전송할 수 있다.

-> 외부에서 Subject의 상태를 변경할 수 있다 !

근데 Relay는 불변성을 유지한다.
이벤트로 Next 이벤트만 받는다. 따라서 disposed 되기 전까지 구독이 해제되지 않아, deinit 시점에 해제되거나, 직접 처리해주어야 한다.

그리고 next 이벤트도 accept라는 키워드로 사용한다.

-> 외부에서 직접 데이터를 보내는 메서드를 제공하지 않고,
오직 내부에서만 데이터를 처리하고 전송할 수 있는 방법(==accept)을 제공한다.

불변성 덕분에 데이터가 예상치 못하게 변경되는 것을 방지할 수 있다.
특히 UI 이벤트 처리에 있어서 데이터의 일관성을 유지하는 데 매우 유용하다.

세트래요~
Subject 💕 Observable
// Relay 💕 Driver

2. 에러 처리

Relay는 에러 이벤트를 처리하지 않는다. 에러가 발생해도, 멈추지 않고 계속 동작한다. 그래서 UI 이벤트를 안정적으로 처리할 수 있다.

3. 다중 구독자 지원!

여러 구독자가 동시에 데이터를 받을 수 있다. 예를 들어, 버튼을 클릭하면 여러 화면에서 동시에 반응해야 하는 경우, Relay를 사용하면 이 이벤트를 한 곳에서 발생시키고, 여러 곳에서 구독하고 처리할 수 있다.

1) PublishRelay

새로운 이벤트만 발생할 수 있는 Relay

-> 구독자는 relay가 생성한 이후 발생하는 이벤트만을 수신할 수 있다.

  • 초기값이 존재하지 않을 때 사용한다.

ex) 버튼 클릭 이벤트

let publishRelay = PublishRelay<String>()
publishRelay.accept("Button Clicked")

publishRelay.subscribe(onNext: {
    print($0) // "Button Clicked" 출력
})

2) BehaviorRelay

현재 값과 함께 relay를 초기화할 수 있다.

-> 구독자는 초기값과 함께 relay의 현재 값을 즉시 받을 수 있으며, 이후에는 새로운 값이 업데이트 될 때마다 이를 수신할 수 있다.

  • 초기값이 존재할 때 사용한다.

ex) 텍스트 필드의 현재값을 실시간으로 받아올 때

let behaviorRelay = BehaviorRelay(value: "Initial Text")
behaviorRelay.accept("Updated Text")

behaviorRelay.subscribe(onNext: {
    print($0) // "Updated Text" 출력
})

Driver랑은 뭐가 달라?

Relay와 Driver 둘 다 RxCocoa에서 제공하는 기능으로, 주로 UI 바인딩을 위해 사용된다.

1. 메인 스레드 보장 여부

그런데
Relay는 특정 스레드에서 동작하지 않는다. 어떤 스레드에서든 데이터를 전송하고 처리할 수 있다.
기본적으로 메인 스레드에서 동작하는 것을 보장하지 않는다.

Driver는 항상 메인스레드에서 동작한다. UI 업데이트를 위해 더 안전하게 사용할 수 있겠다.

2. 에러 처리

Relay는 에러 이벤트를 처리하지 않고, 에러가 발생해도 스트림이 종료되지 않는다.
(onError 부분은 아예 호출되지 않는다)
이건 Driver랑 비슷하다.

Driver도 마찬가지로 에러를 처리하지 않고, 에러 발생해도 종료되지 않는다. 근데 얘는 에러 발생 시에 기본값을 제공하거나, 빈 스트림을 제공할 수 있는 옵션을 제공한다.

let driver = relay.asDriver(onErrorJustReturn: "Default Value")

UI 관련있는 애들 비교 Relay vs Driver vs bind

profile
🍎 Apple Developer Academy@POSTECH 2기, 🍀 SeSAC iOS 4기

0개의 댓글