[Network] Moya를 활용한 Error 처리
Moya를 활용한 Error 처리
MoyaProvider를 이용하여 네트워크 로직을 짜던중 status code 에 따른 에러처리를 나눠서 해줘야 하는 경우가 생겨 한번 처리해 보려고 한다
1. ErrorResponse 구조체 생성
struct ErrorResponse: Decodable {
var message: String?
var code: Int?
}
- message: 서버에서 보내주는 메세지를 직접 유저에게 띄워줘야하는 경우 사용
- code: status code 외에 따로 분기처리가 필요한 경우 사용
2. Moya.Response를 리턴하는 함수 생성
private let provider = MoyaProvider<UserAPI>()
func updateUsername(_ name: String) -> Single<Moya.Response> {
let request = provider.rx
.request(.putUsername(name: name))
return request
}
- 미리 구현해놓은 Moya UserAPI enum type의 provider를 생성해준다
3. subscribe를 통해 에러처리 로직 추가
private func didTapDone() {
let username = "jeremy"
updateUsername(username)
.subscribe(onSuccess: { response in
// success action
}, onError: { error in
if let moyaError = error as? MoyaError,
let statusCode = moyaError.response?.statusCode {
guard let data = moyaError.reseponse?.data,
let errorResponse = try? JSONDecoder().decode(ErrorReseponse.self, from data),
let message = errorResponse.message else {
// docoding error action
return
}
print(message)
// 서버에서 내려주는 메세지 활용
} else {
// network error action
}
})
.disposed(by: disposeBag)
}
- statusCode에 따라 분기처리가 필요할때도 활용 가능하다