개발/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으로 스레드 전환을 해야한다.