2

サービスのバックエンドとのすべての通信を行うネットワーク マネージャー クラスがあります。私は、ネットワーク リクエストが失敗する可能性がある場合に、ユーザーに優れたエクスペリエンスを提供できるように熱心に取り組んでいます。

現在、ネットワーク マネージャー クラスは、バックエンドで認証するための要求を行います。

internal func authenticate(withEmailAddress emailAddress: String, andPassword password: String, withCompletion completion: @escaping (Result<Data>) -> Void) {

    // ...Create the request...

    task = session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in

        if let requestError = error as? NSError {

            // ...Handle CFNetworkErrors (-1001, etc.)...

        }

        if let httpResponse = response as? HTTPURLResponse {

            // ...Handle the response codes (200, 400, 401, 500)...

        } else {

            // ...Handle the response not being of type `HTTPURLResponse`...

        }
    })

    // ...Start the task...

}

Dataまたはの戻りを管理する別のクラスがありますError。これは、応答のステータス コードまたは要求のエラーに基づいています。

HTTP ステータス コードのリストとCFNetworkErrorsのリストを見ると、このようなエラーを処理する可能性がたくさんあることがわかります。私の場合、すべてCFNetworkErrorsが適切であるとは限りませんが、処理するエラーの長いリストが残っています。

をオンにする以外に、考えられるエラーを処理するための指示はありrequestError.codeますか?

すべてを処理するとCFNetworkErrors、次のようなコードをチェックする非常に長いロジック ブロックになってしまいます。

switch code {

    case -1005: // ...Handle error...

    case -1001: // ...Handle error...

    case 1: // ...Handle error...

    case 200: // ...Handle error...

    // ...Handle the rest of the errors...

    default: // ...Handle error...

}

また、次のような適切な応答ステータス コードをすべて処理するための非常に長いブロックになってしまいます。

switch response.statusCode {

    case 200: // ...Do something with data...

    case 400: // ...Handle missing user credentials...

    case 401: // ...Handle incorrect credentials...

    case 500: // ...Handle internal server error...

    // ...Handle the rest of the status codes...

    default: // ...Handle default error...

}

発生する可能性のあるすべてのネットワーク エラーを処理しようとする場合に、どのような良い方法があるかについて、いくつかのガイダンスを教えていただけますか?

4

1 に答える 1

3

まず第一に、考えられるすべてのネットワーク エラーを具体的に処理することは非常に難しいと思います。すでにご存じのとおり、多数のステータスがあるため、ステータスのグループを処理するために、もう少し一般的なものにする方がはるかに簡単です。次のように、case ステートメントで範囲演算子を使用できます。

switch response.statusCode {

    case 200...299: // ...Do something with data...

    case 300...399: // ...Handle redirect...

    case 400...499: // ...Handle client error...

    case 500...599: // ...Handle server error...

    default: // ...Handle default error...

}

処理したい特定のケースをそこに追加することもできます。たとえば、401 Unauthorized を非常に具体的な方法で処理し、おそらくユーザーに通知したい場合があるため、それを独自の switch ステートメントに追加するだけです。大文字と小文字を区別して、ユーザーに問題を通知するコードを呼び出します。

于 2016-12-12T15:07:35.667 に答える