관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] subscribe(on:)와 observe(on:)의 차이 (RxSwift) 본문

iOS 응용 (swift)

[iOS - Swift] subscribe(on:)와 observe(on:)의 차이 (RxSwift)

jake-kim 2022. 12. 9. 22:41

사전 지식

  • 아래 코드에서 1번과 2번 중 subscription 영역과 observing 영역을 구분하면?
    • 1번 - subscription 영역
    • 2번 - observing 영역
    Observable<Int>
      .create { observer in
        // 1.
      }
      .subscribe(onNext: { _ in
        // 2.
      })
      .disposed(by: disposeBag)

subscribe(on:)와 observe(on:)

  • subscribe(on:)은 subscription영역에 대한 스레드를 의미
  • observe(on:)은 observing영역에 대한 스레드를 의미

테스트

  • 메인 스레드에서 아래 코드 호출
    • subscription영역과 observing영역은 main thread
Observable<Int>
  .create { observer in
    observer.onNext(1)
    print("1", Thread.isMainThread) // true
    return Disposables.create()
  }
  .subscribe(onNext: { _ in
    print("2", Thread.isMainThread) // true
  })
  .disposed(by: disposeBag)
  • subscription영역을 백그라운드 스레드로 바꾸는 subscribe(on:)을 추가할 경우
    • subscription영역이 background로 되므로 아래 observing도 background로 변경
Observable<Int>
  .create { observer in
    // subscription 영역
    observer.onNext(1)
    print("1", Thread.isMainThread) // false
    return Disposables.create()
  }
  .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background))
  .subscribe(onNext: { _ in
    // observing 영역
    print("2", Thread.isMainThread) // false
  })
  .disposed(by: disposeBag)
  • observing 영역을 메인 스레드로 바꾸는 observe(on:)을 추가할 경우
    • observing 영역의 스레드는 main으로 변경
Observable<Int>
  .create { observer in
    // subscription 영역
    observer.onNext(1)
    print("1", Thread.isMainThread) // false
    return Disposables.create()
  }
  .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background))
  .observe(on: MainScheduler.asyncInstance)
  .subscribe(onNext: { _ in
    // observing 영역
    print("2", Thread.isMainThread) // true
  })
  .disposed(by: disposeBag)
  • observe(on:)이 subscribe(on:)위에 있어도 당연히 위와 동일한 결과
Observable<Int>
  .create { observer in
    // subscription 영역
    observer.onNext(1)
    print("1", Thread.isMainThread) // false
    return Disposables.create()
  }
  .observe(on: MainScheduler.asyncInstance)
  .subscribe(on: ConcurrentDispatchQueueScheduler.init(qos: .background))
  .subscribe(onNext: { _ in
    // observing 영역
    print("2", Thread.isMainThread) // true
  })
  .disposed(by: disposeBag)

* 참고

http://rx-marin.com/post/observeon-vs-subscribeon/

Comments