RxJava로 안전하게 이벤트 통지를 실시하기 위한 RxRelay

이것은 RxJava Advent Calendar 2017의 7 일째 기사입니다. 의외로 캘린더가 스카스카 하고 있어 RxJava 자체의 지견은 상당히 소진되어 버린 것일까라는 느낌이군요.

이번에는 RxRelay라는 라이브러리를 소개하려고합니다.
※ RxJava에 대한 기초 지식은 있는 것을 전제로 한 기사입니다.

RxRelay란?


  • htps : // 기주 b. 코 m / 그럼 r 톤 / Rx re y
  • 안드로이드 세계에서 하나님이라 불리는 Jake Wharton의 RxJava 용 라이브러리
  • Subject보다 안전한 Relay라는 메커니즘을 도입하는 것

  • Relay는 Subject에서 onCompleteonError를 호출하는 기능을 없애고, 즉 onNext에서 값을 흘리는 것에 특화한 Subject라고 할 수 있습니다. Relay는 다음과 같은 특성과 기능을 가지고 있습니다.
  • ObservableConsumer로 행동
  • accept에서 받은 값을 onNext로 흘리기
  • 스트림이 종료되지 않음
  • observable.subscribe(relay)는 Disposable을 반환하므로 구독 취소가 간단합니다
  • toSerialized() 호출하여 스레드로부터 안전한 Relay를 생성 할 수 있습니다
  • AsyncSubject에 해당하는 AsyncRelay 없음 (스트림 종료 없음)

  • 이러한 특성으로 인해 Relay는 비Rx API를 Rx용 이벤트 스트림으로 변환하는 데 매우 적합합니다.

    Relay의 사용 장소



    Subject를 사용하고 있어 onNext 로 값을 흘리고 있는 것만은 Relay 로 옮겨놓을 수가 있습니다.

    예를 들어, RxBinding을 사용하여 MVVM의 데이터 바인딩 (Android의 DataBinding Library가 아님)을 구현하는 패턴으로 버튼 클릭 이벤트를 ViewModel에 알리고 싶다면 Subject로 작성하면 다음과 같습니다.
    class SomeViewModel {
        val onButtonClick = PublishSubject.create<Unit>()
    }
    
    val viewModel = SomeViewModel()
    
    button.clicks()
            .subscribe { viewModel.onButtonClick.onNext(Unit) }
            .addTo(...)
    

    이것을 Relay로 바꾸면,
    class SomeViewModel {
        val onButtonClick = PublishRelay.create<Unit>()
    }
    
    val viewModel = SomeViewModel()
    
    button.clicks()
            .subscribe(viewModel.onButtonClick)
            .addTo(...)
    

    이렇게 깔끔하게 쓸 수 있어 onNext 가 배제되어 데이터 바인딩의 리액티브감도 보다 높아진다고 생각합니다. (개인의 감상입니다)

    RxSwift에도 수입



    RxSwift에도 RxSwift4에서 Relay가 도입된 것 같습니다. 정확하게는, Cocoa/UIKit와의 바인딩을 제공하는 RxCocoa 쪽에 도입되었습니다만, 거의 표준의 기능이라고 말해도 좋을 것입니다.

    참고 기사:
    ht tp // ch. 메르카리. 코m/엔트리/2017/12/04/103247
    ht tp // ch. 이런 사람. 코 m / 엔 트리 / ゔ 리아 b ぇ- s-p

    RxJava/RxSwift로 양 OS용 앱을 개발하고 있는 몸으로서는 매우 도움이 됩니다
    RxJava도 Relay를 표준 기능으로 도입해도 좋은 생각이 들었습니다.

    추가: RxJS에도



    방금 기사를 쓴 며칠 후이지만 RxJS 용 Relay도 출시되었습니다. (게다가 Microsoft제)

    이상입니다.

    좋은 웹페이지 즐겨찾기