ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Rxswift 네트워크 에러 핸들링
    개발/Swift 2023. 4. 2. 15:00
    public func checkSignUpID(loginID: String) -> Observable<Bool>
    
    

    위 함수는 네트워킹을 통해 Bool 타입을 Obseravle로 감싸 리턴해준다.

    해당 타입은 true, false ,error 를 Obervable에 감싸 리턴한다.

    요구 조건은 다음과 같다.

    1. 에러가 발생해도 VC의 구독이 끊기면 안된다.
    2. 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등을 사용하는것도 방법이될수 있다.

    댓글

Designed by Tistory.