BehaviorRelay vs BehaviorSubject

  • BehaviorRelay
    • 항상 초기값을 가진다
    • 종료이벤트를 지원하지 않는다. (onComplete, onError)
    • 현재값을 직접 읽을 수 있는 value 속성을 제공한다.
      • 문제가 될 수 있음 (값을 구독을 통하지 않고 가져오면)
    • 장단점
      • 장점
        • 상태관리가 쉽고 간편하다. value를 통해 값에 직접 접근이 가능하고 accept를 통해 쉽게 업데이트할 수 있다.
        • 종료이벤트를 지원하지 않아 스트림이 종료되지 않고 항상 새로운 값을 방출할 수 있다.
        • 항상 초기값을 필요로하기 때문에 예외적인 상황을 줄일 수 있다
      • 단점
        • 종료이벤트가 없다
        • RxRelay에 종속적이다
    • 사용예시
      • 사용자입력필드같이 값이 지속적으로 업데이트되어야하는 상황 (검색어 입력필드 등)
  • BehaviorSubject
    • 초기값을 가져야하지만, 초기값 없이 시작할 수도 있다.
    • 종료이벤트를 지원한다. (onComplete, onError)
    • value 속성이 없다. subscribe를 통해 값을 얻어와야한다.
    • 장단점
      • 장점
        • oNext, onComplete, onError 등 모든 이벤트를 방출할 수 있어 유연한 사용이 가능하다
        • RxSwift 기본 기능이다.
      • 단점
        • value가 없어 상태접근이 복잡하다
        • 종료 이벤트 관리가 필요하다
      •  사용예시
        • 초기값이 필요하지 않을 때: 특정 작업의 상태를 관리할 때
        • 네트워크 요청 결과 관리할 때: 성공 시 데이터 방출, 실패 시 onError 방출가능

 

RxSwift에서 사용되는 BehaviorRelay, BehaviorSubject, PublishRelay, PublishSubject는 모두 이벤트를 발행하고 구독할 수 있는 객체입니다. 각각의 특성과 장단점을 정리해보겠습니다.

BehaviorRelay

  • 특성:
    • 항상 현재 상태의 값을 유지합니다.
    • 옵셔널을 허용하지 않습니다.
    • 구독 시 즉시 마지막 값을 발행합니다.
    • Relay는 바인딩이 가능하며, 에러를 발행하지 않습니다.
  • 장점:
    • 상태 관리가 용이하며, 항상 최신 상태를 구독자에게 전달합니다.
    • 상태 변화를 쉽게 관찰할 수 있습니다.
  • 단점:
    • 초기값이 필요하며, 옵셔널 타입을 사용할 수 없습니다.

BehaviorSubject

  • 특성:
    • 항상 현재 상태의 값을 유지합니다.
    • 옵셔널을 허용합니다.
    • 구독 시 즉시 마지막 값을 발행합니다.
    • 에러와 완료 이벤트를 발행할 수 있습니다.
  • 장점:
    • 상태 관리가 가능하며, 최신 상태를 구독자에게 제공합니다.
    • 에러와 완료 이벤트를 발행할 수 있어 더 다양한 시나리오에서 활용 가능합니다.
  • 단점:
    • 초기값이 필요합니다.

PublishRelay

  • 특성:
    • 현재 상태를 유지하지 않으며, 새로운 이벤트만 발행합니다.
    • 구독 시점 이후의 이벤트만 구독자에게 전달합니다.
    • 에러를 발행하지 않습니다.
  • 장점:
    • 단순 이벤트 전달에 적합하며, 상태를 유지할 필요가 없을 때 사용하기 좋습니다.
    • 에러 전파가 필요 없는 경우에 사용하기 유리합니다.
  • 단점:
    • 구독 시점 이전의 이벤트를 놓칠 수 있습니다.

PublishSubject

  • 특성:
    • 현재 상태를 유지하지 않으며, 새로운 이벤트만 발행합니다.
    • 구독 시점 이후의 이벤트만 구독자에게 전달합니다.
    • 에러와 완료 이벤트를 발행할 수 있습니다.
  • 장점:
    • 단순 이벤트 발행에 적합하며, 구독 시점 이후의 이벤트만 필요할 때 유용합니다.
    • 에러와 완료를 발행할 수 있어 플로우 제어에 용이합니다.
  • 단점:
    • 구독 시점 이전의 이벤트는 받을 수 없습니다.

이러한 특성들을 고려하여 사용 목적에 맞는 객체를 선택하여 사용하면 더 효과적으로 RxSwift를 활용할 수 있습니다.

 

RxSwift에서 Publish와 Behavior, Relay와 Subject는 각각 다른 개념으로 구분됩니다. 이를 이해하는 것은 RxSwift를 효과적으로 사용하는 데 매우 중요합니다.

Publish vs Behavior

  • Publish
    • 특성: Publish는 새로운 이벤트만 발행합니다. 구독자는 구독 시점 이후에 발생하는 이벤트들만 받을 수 있습니다.
    • 사용 사례: 상태를 유지할 필요가 없고, 단순히 이벤트 스트림을 전달하고자 할 때 적합합니다. 예를 들어, 버튼 클릭 이벤트와 같이 구독 시점 이전의 이벤트가 중요하지 않은 경우에 유용합니다.
  • Behavior
    • 특성: Behavior는 항상 마지막 상태를 유지하고, 구독자가 새로 구독할 때 즉시 이 상태를 전달합니다.
    • 사용 사례: 상태를 유지하고 싶을 때 사용합니다. 예를 들어, 현재 선택된 항목이나 사용자 세션 상태처럼 구독자가 항상 최신 상태를 알고 있어야 하는 경우에 적합합니다.

Relay vs Subject

  • Relay
    • 특성: Relay는 에러를 발행하지 않으며, 완료 이벤트도 발행하지 않습니다. Relay는 항상 현재 상태(또는 이벤트)를 발행하지만 에러 핸들링이 필요 없는 상황에서 주로 사용됩니다.
    • 사용 사례: UI 이벤트 처리와 같은 상황에서 사용됩니다. 상태 관리 및 이벤트 전파에 주로 사용되며, 에러 전파가 필요 없는 경우에 적합합니다.
  • Subject
    • 특성: Subject는 일반적으로 에러와 완료 이벤트를 발행할 수 있습니다. 이는 스트림이 끝나거나 에러가 발생할 경우 이를 처리할 수 있게 합니다.
    • 사용 사례: 스트림의 종료나 에러 상태를 관리해야 할 필요가 있을 때 사용합니다. 비동기 작업의 성공/실패를 알리고자 할 때 적합합니다.

요약

  • Publish는 새 이벤트만 발행하며, 구독 시점 이후의 이벤트를 전달합니다.
  • Behavior는 최신 상태를 유지하며, 새 구독자에게 즉시 이 상태를 발행합니다.
  • Relay는 에러와 완료 이벤트 없이 이벤트를 발행하며, 상태 관리에 주로 사용됩니다.
  • Subject는 에러와 완료 이벤트를 포함하여 전체 이벤트 흐름을 관리할 수 있습니다.

이러한 개념들을 조합하여 사용하면 다양한 시나리오에서 RxSwift를 더 효과적으로 활용할 수 있습니다.

'iOS' 카테고리의 다른 글

Lecture 3 | Stanford CS193p 2023  (0) 2024.10.30
TDD with Swift  (0) 2024.08.01
딥링크 크래시 현상  (0) 2024.03.25
미래의 나를 위한 Mac Ventura(13.4) 에서 Xcode 13.4.1 돌리기  (0) 2024.01.15