개발/Swift
Relay를 사용하면 무조건 메인스레드 일까
덤벨로퍼
2023. 4. 2. 15:03
Relay나 Driver를 사용하면 에러나 complete이 없기때문에 UI 작업에
적합하다 알고있었기에 아무 거리낌없이 사용중이었다.
var error: PublishRelay<Error> { get }
뷰 모델에서 에러가 발생하는경우 위 Relay에 에러를 accept 해서
뷰컨트롤러에 전달한다.
뷰컨트롤러는 해당 error 를 바인딩 하고 있다가
에러가 떨어지면 모달을 띄우는 역할을 하고있다.
네트워킹의 경우 background 스레드를 사용하고있다.
네트워킹에서 에러가 발생하는 경우
//Background Thread
self.error.accept(error)
에러를 방출 시켜주었다.
이때 뷰컨트롤러에서 crash가 발생했다.
modal을 띄우는것은 메인스레드를 쓰라는 것이다.
viewModel.error
.bind {[weak self] error in
//Crash
self?.showErrorAlert(error: error)
}.disposed(by: disposeBag)
PublishRelay는 메인스레드에서만 작동 하는줄 알았지만 아니었다.
알아서 스레드를 전환해 주지 않았다.
백그라운드 스레드에서 accept하면
백그라운도 스레드에서 bind가 일어난다.
따라서 bind()에서 VC에서 UI 작업을 한다면
꼭 observe On으로 스레드 전환을 해야한다.