7

iOS アプリのネットワーキングに RxSwift で Moya を使用していObserverますonError

API は常に次の JSON 形式でエラー応答を返します。

{
   "error": {
      "message": "Error message goes here",
      "code": "String error code"
   }
}

目標は、次のコード スニペットのようなものを達成することです。ここで、渡されるエラーonErrorは、型ではなくカスタム エラー型Moya.Errorです。

observable
    .subscribe(
        onNext: { response in
            // Do typical onNext stuff
        },
        onError: { error in
            // Get and consume my custom error type here:
            let customError = error as! MyCustomErrorModel
            print("My API's error message: \(customError.error?.message)")
            print("My API's error code: \(customError.error?.code)")
        })

カスタムを使用してこれらのエラーを正常にインターセプトし、カスタム エラー モデルに逆シリアル化することができます(この SO の質問PluginTypeから以下に貼り付けます) が、これらのモデルを最終的に.Observer

import Foundation
import Moya
import ObjectMapper
import Result

struct CustomAPIErrorPlugin: PluginType {

// Called immediately before a request is sent over the network (or stubbed).
func willSendRequest(request: RequestType, target: TargetType) { }

// Called after a response has been received, but before the MoyaProvider has invoked its completion handler.
func didReceiveResponse(result: Result<Moya.Response, Moya.Error>, target: TargetType) {
    let responseJSON: AnyObject
    if let response = result.value {
        do {
            responseJSON = try response.mapJSON()
            if let errorResponse = Mapper<MyCustomErrorModel>().map(responseJSON) {
                print("Custom error code from server: \(errorResponse.error?.code)")
            }
        } catch {
            print("Failure to parse JSON response")
        }
    } else {
        print("Network Error = \(result.error)")
    }
}
4

1 に答える 1