개발/Swift

Rxswift - ObserveOn , SubscribeOn

덤벨로퍼 2022. 11. 18. 16:03

Observable의 쓰레드를 변경시키는 두가지방법이 있다.

일반적으로 별도의 설정 없이는

“구독한 시점에서의 쓰레드” 를 사용한다.

//Main Thread에서 productList Observable 생성

output.productList
  .bind(to: productListTableView.rx.items(cellIdentifier: "ProductListCell", cellType: ProductListTableViewCell.self)) {[weak self] (_, element, cell) in
      print("Thread.isMainThread \\(Thread.isMainThread)") //→ 메인스레드 true
      cell.configure(id: element.id, nameKo: element.nameKo, nameEn: element.nameEn, price: element.price, supplier: element.supplier?.name)
      self?.loadingView?.removeFromSuperview()
  }

  .disposed(by: disposeBag)

 

해당 쓰레드를 변경하고 싶을때 observeOn을 사용한다.

output.productList
  .observe(on: ConcurrentDispatchQueueScheduler(qos: .userInteractive))
  .map({ _ in
      print("Thread.isMainThread \\(Thread.current.isMainThread)")

  })
  .observe(on: MainScheduler.instance)
  .map({ _ in
      print("Thread.isMainThread \\(Thread.current.isMainThread)")

  })
  .subscribe()
  .disposed(by: disposeBag)

첫번째 map 에서는 Main → false

두번째 map Main → true 가 떨어진다.

observeOn 하위에 영향을 주는것을 알수있고

다시 observeOn을 통해 쓰레드가 변경될수도 있다.

 

 

subscribeOn은 sequence가 생성될때

쓰레드를 지정한다.

sequence가 생성되는 시점은 subscribe()가 호출 되는 시점이다.

Observable.create{ observer in
	//여기에 영향을 줌
}
.subscribe {
	//여기 영향 X
}

subscribe에서는 observeOn한 쓰레드를 사용하고

Observable 을 생성하고있는 create 클로져 에서

subscribeOn 에서 지정한 쓰레드를 사용한다.