-
Rxswift 네트워크 에러 핸들링개발/Swift 2023. 4. 2. 15:00
public func checkSignUpID(loginID: String) -> Observable<Bool>
위 함수는 네트워킹을 통해 Bool 타입을 Obseravle로 감싸 리턴해준다.
해당 타입은 true, false ,error 를 Obervable에 감싸 리턴한다.
요구 조건은 다음과 같다.
- 에러가 발생해도 VC의 구독이 끊기면 안된다.
- false와 error 모두 다른 핸들링이 필요하다.
일반적으로 사용하면 checkSignUpID() 에서 에러 발생시 구독이 끊긴다.
그러면 다시 요청했을때 아무런 이벤트가 발생 하지 않는다
구독이 끊기지 않게 하기 위해서 catch를 사용해 다시 Observable을 리턴해줘여한다.
let subscribe = validSignUpID(loginID: loginID) .catch { error in print(error) return Observable.just(false) } subscribe .onNext(...)
ㅇ
위처럼 에러 발생하면 catch 문 타게 해서 처리할거 있음 해주고
새로운 Observable을 리턴 해줘야 구독이 끊기지 않는다.
하지만 문제가 있다. 무조건 같은 타입의 무언가를 리턴해줘야 한다는것이다.
만약 false 와 error 의 상황 모두 VC에서 같은 처리를 한다면
위처렴 false를 리턴해주면 문제 없겠지만
만약 false와 error 의 상황에서 다른 에러처리를 해야한다면
false를 리턴해주면 안될것이므로 별도의 처리가 필요하다
이런경우에는 결국 두개의 Subject를 사용해야한다.
var validSignUpID: PublishRelay<Bool> var error: PublishRelay<Error> //VM checkSignUpID(loginID: loginID) .subscribe { isValid in validSignUpID.accept(isValid) } onError: { error in self.error.accept(error) }.disposed(by: disposebag) //VC viewModel.validSignUpID .bind { isValid in print("isValid \\(isValid)") } .disposed(by: disposeBag) viewModel.error .bind { error in print("error \\(error)") } .disposed(by: disposeBag)
ㅇ위처럼 error와 결과값을 받을 subject를 따로 두고
VC 에서 구독하여 사용해야한다.
VC에서 구독중인 무언가는 결국 에러를 받지 않아야한다.
그래서 에러가 발생하지 않는 Driver등을 사용하는것도 방법이될수 있다.
'개발 > Swift' 카테고리의 다른 글
확장 축소 가능한 동적 높이 TableView 구현 하기 (0) 2023.04.16 Relay를 사용하면 무조건 메인스레드 일까 (0) 2023.04.02 Rx + TableView(CollectionView) 바인딩 안되는 오류 해결방법 (0) 2023.03.21 [Swift] 직접 UITableView를 구현하기 (1) 2023.01.12 [Swift] 다양한 데이터 타입 동적으로 Decoding 하기 (0) 2023.01.09