-
Relay를 사용하면 무조건 메인스레드 일까개발/Swift 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으로 스레드 전환을 해야한다.
'개발 > Swift' 카테고리의 다른 글
Swift Tooltip 구현하는 방법 (2) 2023.05.21 확장 축소 가능한 동적 높이 TableView 구현 하기 (0) 2023.04.16 Rxswift 네트워크 에러 핸들링 (0) 2023.04.02 Rx + TableView(CollectionView) 바인딩 안되는 오류 해결방법 (0) 2023.03.21 [Swift] 직접 UITableView를 구현하기 (1) 2023.01.12