개발/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 에서 지정한 쓰레드를 사용한다.