웰코발
웰코's iOS
웰코발
전체 방문자
오늘
어제
  • 분류 전체보기 (63)
    • Swift (26)
    • rxSwift (13)
    • SwiftUI (3)
    • iOS (12)
    • 기타 (1)
    • 개발관련 용어정리 (6)
    • 면접준비 (0)
    • 공공데이터 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • alamofire
  • Coordinator
  • rxswift
  • delay
  • Observable
  • WKWebView
  • ios
  • SWIFT
  • content_available
  • 디자인
  • 측정소정보
  • ReactorKit
  • UI
  • uitableview
  • cell
  • Scroll
  • 대기오염통계 현황
  • swiftUI
  • collectionview
  • 주제구독

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
웰코발

웰코's iOS

[rxSwift] Subject 를 wrapping한 Relay 사용법
rxSwift

[rxSwift] Subject 를 wrapping한 Relay 사용법

2022. 10. 21. 22:28

Relay

  • rxSwift와 달리 Rxcocoa를 import 해야 함.
  • Subject의 Wrapping 버전으로 Subject의 특성을 가진 채 변형됨.
  • .onNext가 아니라 .accept으로 사용함. (accept안에 onNext가 구현되어있음)
  • .error 와 .complete 에 대해서 방출 하지 않는다. 오로지 .accept 로 받기만 한다.
  • error 와 complete 가 없기 때문에 해당 조건이 발생할 수 없으므로 에러가 나도 무시됨.
  • 즉, 계속해서 살아있는 스트림임. UI Event 와 바인딩 하여 사용하기에 적합함.
  • Dispose되기 전까지 살아있음.
  • Publish Relay와 Behavior Relay가 있음.

PublishRelay 

  • PublishRelay는 PublishSubject의 Wrapper 클래스임.
  • PublishSubject의 특성처럼 구독 이후의 발생하는 이벤트들만 알 수 있음.
  • accept 를 통해 이벤트를 받고 subscribe를 통해 방출.
let publishRelay = PublishRelay<Int>()

publishRelay.accept(3) 
publishRelay.accept(4) 
publishRelay.subscribe { print($0) }
publishRelay.accept(5) 

// publishRelay 구독 시점
// next(5)

 

BehaviorRelay

  • BehaviorRelay는 BehaviorSubject의 Wrapper 클래스임.
  • BehaviorSubject의 특성처럼 초기값을 가지고 직전 값을 방출함.
  • accept 를 통해 이벤트를 받고 subscribe를 통해 방출.
  • .value를 통해서 현재의 값을 가져올 수 있음. (읽기 Get 만 가능, 쓰기 Set 불가능)
let behaviorRelay = BehaviorRelay(value: 5)

behaviorRelay.accept(6)
behaviorRelay.subscribe { print($0) } 
behaviorRelay.accept(4) 

print(behaviorRelay.value) // 4 (읽기전용)

// next(6)  //직전 값 방출
// next(4)

// 4

 

ReplayRelay

  • ReplayrRelay는 ReplaySubject의 Wrapper 클래스임.
  • ReplaySubject의 특성처럼 버퍼를 가지고 버퍼 사이즈 만큼 방출.
  • accept 를 통해 이벤트를 받고 subscribe를 통해 방출.
let replayRelay = BehaviorRelay(bufferSize: 2)

replayRelay.accept(2)
replayRelay.accept(3)
replayRelay.accept(4)
replayRelay.accept(5)
replayRelay.subscribe { print($0) } 
replayRelay.accept(6) 

// next(4)  // 버퍼에 저장된 값
// next(5)  // 버퍼에 저장된 값
// next(6)

 

Driver

  • UI에 특화된 Observable
  • Relay를 관찰할 때 Observable 대신  wrapping 한 형태인 Driver 형태로 관찰
  • Observable 은 기본적으로 background thread 에서 동작하지만, Driver 는 무조껀 main thread 에서 동작함.
  • Main Scheduler에서 동작함. observeOn(MainScheduler.instance) 해줄 필요 없음.
  • asDriver로 바뀌면 .subscribe가 아니라 .drive를 통해 구독해야 함.
  • .drive는 onError가 없음.
  • rxCocoa를 import 해야 사용 가능. 
  • Driver는 .drive로 구독 시 가장 최근 이벤트를 받음.
  • 즉, 초기값이 없는 PublishRelay에선 사용이 불가능함. BehaviorRelay에서 사용하기 적합함.
  • 초기값이 없는 PublishRelay와 같은 예시에서 사용하기 위해서는 .asDriver(onErrorJustReturn: ...) 와 같은 강제적으로 초기값을 만들어주는 형태로 사용할 수 있다.
pwField.rx.text.orEmpty
               .subscribe(onNext: viewModel.passwordInput)
               .disposed(by: disposeBag)
// 위 코드를 relay 처럼 사용하려면
pwField.rx.text.orEmpty 
                .asDriver()
                .drive(onNext: viewModel.passwordInput)
                .disposed(by: disposeBag)

 

Signal

  • 위 상황에서, PublishRelay를 driver의 drive 처럼 사용하고 싶으면 signal의 emit 을 사용하면 됨.
  • Driver 처럼 구독하는 순간 초기값이나 최신값을 주지 않음. 구독한 이후에 발행되는 값을 받음. 
  • Signal은 emit함수로 이벤트 처리 / Driver는 drive함수로 이벤트 처리 
signal.emit(onNext: { (element) in 
   
}
   
driver.drive(onNext: { (element) in 
   
}

 

Variable (Deprecated)

  • BehaviorSubject 를 래핑하고, 현재의 값을 상태로 보존. 가장 최신/초기 값만을 새로운 subscriber에게 방출
  • BehaviroRelay는 Variable 처럼 하나의 값을 가지고 있다. 하지만 BehaviorRelay의 값은 읽기 전용이다. Variable에서 사용하듯이 = 를 사용해서 값을 대입하지 못한다.
  • Variable의 값을 대입하는 것은 명령형 프로그래밍 스타일이다. 그래서 선언형 프로그래밍 스타일인 Reactive의 초기에는 포함되어 있지 않았을 것이라 생각한다. 향후에 Variable은 사용되지 않을 것이고 BehavoirRelay의 별칭처럼 사용될 것이다. 그래서 이제 부터 이것을 고려하는 것이 좋을 것이다.

 

 

Subject와 Relay의 차이점

  • Subject는 .completed, .error의 이벤트가 발생하면 subscribe가 종료됨
  • Relay는 .completed, .error를 발생하지 않고 Dispose되기 전까지 계속 작동하기 때문에 UI Event에서 사용하기 적합

'rxSwift' 카테고리의 다른 글

[rxSwift] Transforming Operator 의 종류  (0) 2022.10.23
[rxSwift] Filtering Operator 의 종류  (0) 2022.10.22
[rxSwift] Subject 에 대한 이해와 종류  (0) 2022.10.21
[rxSwift] Dispose 는 왜 하는 걸까?  (0) 2022.10.20
[rxSwift] Observable create 하는 법  (0) 2022.10.20
    'rxSwift' 카테고리의 다른 글
    • [rxSwift] Transforming Operator 의 종류
    • [rxSwift] Filtering Operator 의 종류
    • [rxSwift] Subject 에 대한 이해와 종류
    • [rxSwift] Dispose 는 왜 하는 걸까?
    웰코발
    웰코발
    나의 개발 일지

    티스토리툴바