주희하세요!

Relay

2019-07-14
Juhee Kim

Relay

RxRelay는 PublishRelay와 BehaviorRelay의 두 종류의 릴레이를 제공합니다. 기존 PublishSubject와 BehaviorSubject와는 두 가지 차이점을 가집니다. :

  • Relay는 .complete 이벤트가 발생하지 않습니다.
  • Relay는 .error 이벤트가 발생하지 않습니다. 즉 릴레이는 .next 이벤트 만 방출하고 절대로 .error / .complete 이벤트가 나오지 않습니다. 마지막에 .dispose만 발생합니다.

  • .onNext(), .onError(), .onComplete()가 없습니다. 항목을 내보내기 위해서는 .onNext() 대신 .accept()를 사용합니다.

Subject의 경우 오류가 발생할 경우 sequence가 종료되지만, Relay는 dispose가 불리기 전까지 종료되지 않기 때문에 UI 이벤트를 받을 때 사용해볼 수 있을 것 같습니다.

PublishRelay

    func testForPublishRelay() {
        let disposeBag = DisposeBag()

        let publishRelay = PublishRelay<String>()
        publishRelay.accept("Is Anyone Else?")
        publishRelay.subscribe(onNext: { str in
            print("observer 1 : \(str)")
        }, onCompleted: {
            print("observer 1 complete ")
        }, onDisposed: {
            print("observer 1 disposed ")
        }).disposed(by: disposeBag)

        publishRelay.accept("Hi")
        publishRelay.accept("Observers")

        publishRelay.subscribe(onNext: { str in
            print("observer 2 : \(str)")
        }, onCompleted: {
            print("observer 2 complete ")
        }, onDisposed: {
            print("observer 2 disposed ")
        }).disposed(by: disposeBag)
        publishRelay.accept("nice to")
        publishRelay.accept("meet you guys.")
    }

결과

observer 1 : Hi
observer 1 : Observers
observer 1 : nice to
observer 2 : nice to
observer 1 : meet you guys.
observer 2 : meet you guys.
observer 1 disposed
observer 2 disposed

BehaviorRelay

  • value property로 현재 값을 가져올 수 있습니다.

    예제

      func testForBehaviorRelay() {
          let disposeBag = DisposeBag()
    
          let behaviorRelay = BehaviorRelay<String>(value: "Is Anyone Else?")
          behaviorRelay.subscribe(onNext: { str in
              print("observer 1 : \(str)")
          }, onCompleted: {
              print("observer 1 complete ")
          }, onDisposed: {
              print("observer 1 disposed ")
          }).disposed(by: disposeBag)
    
          behaviorRelay.accept("Hi")
          behaviorRelay.accept("Observers")
    
          behaviorRelay.subscribe(onNext: { str in
              print("observer 2 : \(str)")
          }, onCompleted: {
              print("observer 2 complete ")
          }, onDisposed: {
              print("observer 2 disposed ")
          }).disposed(by: disposeBag)
    
          behaviorRelay.accept("nice to")
          behaviorRelay.accept("meet you guys.")
      }
    

    결과

    observer 1 : Is Anyone Else?
    observer 1 : Hi
    observer 1 : Observers
    observer 2 : Observers
    observer 1 : nice to
    observer 2 : nice to
    observer 1 : meet you guys.
    observer 2 : meet you guys.
    observer 1 disposed
    observer 2 disposed
    

Similar Posts

다음 Why use Rx?

Comments