ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RxSwift] share, subscribe vs bind vs drive, Scheduler, observeOn, subscribeOn
    🧃RxSwift 2022. 10. 27. 19:42

     

    Share

    • 일반적으로 subscribe(bind)를 할 때마다 새로운 시퀀스가 생성이 됨!
    • 따라서 여러 subscribe를 하게 될 경우 불필요한 리소스가 발생할 수 있기 때문에 내부적으로 모든 subscribe가 하나의 subscribe를 공유할 수 있게 해주는 것!
    • share의 파라미터인 replay와 scope를 통해 버퍼 사이즈와 유지 상태를 결정할 수 있음!
    • ex) share()가 구현되어있지 않다면 네트워크 요청이 여러 번 일어나게 되기 때문에 불 필요한 콜이나 리소스 낭비가 생기기 때문에 share()로 해결 가능!

     

    Subscribe vs Bind vs Drive

    subscribe

    • 에러 처리 가능
    • 쓰레드 지정 가능
    💡 일반적 상황, 즉 에러처리, 쓰레드 지정해야하는 경우 등 다양한 상황에서 사용함!

    bind

    • 에러 처리 불가
    • 사실상 onNext만 구현한 subscribe
    • Main Thread에서의 실행을 보장
    • UI에 특화된 형태
    💡 에러처리를 따로 안하므로 주로 error가 없는 button.rx.tap 같은 UX subscribe 용으로 많이 사용함!

    drive

    • 에러 처리 불가
    • Main Thread에서의 실행을 보장
    • Stream 공유가 됨!
    • UI에 특화된 형태
    • 내부적으로 share(replay: 1, scope: .whileConnected) 가 구현되어 있음!
    💡 메인스레드에서 실행된다는 보장이 있기 때문에 주로 백그라운드 작업 후 UI에 적용되어야 할 때 사용됨!

     

    Scheduler

    • iOS의 GCD와 유사하며, Thread 관리를 하기 위해 Scheduler를 사용함!
    • serial scheduler를 사용한다면, Rx는 직렬적으로 진행
    • cuncurrent scheduler를 사용한다면, Rx는 동시에 진행

    1) MainScheduler

    • 메인 쓰레드에서 가장 위에 존재(UI와 high-priority tasks를 진행 ,,, heavy task는 피해야함(API request등)
    • UI를 갱신하려면 이 스케줄러로 변경하여 사용

    2) SerialDispatchQueueScheduler

    • background에서 추출하는 일을 처리할 때 사용 (Firebase를 사용할 때 서버의 endpoint에 너무 많은 pressured을 줄일 수 있음)

    3) ConcurrentDispatchQueueScheduler

    • SerialDispatchQueueScheduler와 같이 추출하는 일을 처리할 때 사용, 단 병렬적(작업량이 많은 일에 사용)

    4) TestScheduler

    • 테스트를 위한 것이며, production code에는 사용하지 않음
    • RxTeat 라이브러리에 존재

     

    연산자

    observeOn

    • observable이 observer에게 다른 Thread로 동작하게 변경해줌!
    • observeOn 이후에 오는 연산자에 대한 Scheduler를 지정하게 됨!
    • observeOn을 특정 작업이나 연산에 Scheduler를 변경할 수 있어 여러 번 사용할 수 있음!
    • observer(on: MainScheduler.instance) - Main Thread로 변경

    subscribeOn

    • Observable이 시작이 되는 Scheduler를 지정함!
    • subscribeOn은 Obervable이 동작하는 Scheduler를 변경하는 것이기 때문에 한번만 사용하는 게 좋음!

     

Designed by Tistory.