2016-12-11 9 views
1

サービスのバックエンドとのすべての通信を行うネットワーキングマネージャクラスがあります。ネットワークの要求が失敗する可能性がある場合に、ユーザーに素晴らしい体験を提供しようとしています。すべての潜在的なネットワークエラーを適切に処理する方法はありますか?

は今、ネットワークマネージャクラスは、バックエンドでの認証を要求する:

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のいずれかのリターンを管理し、別のクラスを持っています応答のステータスコードまたは要求のエラー

​​と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... 

} 

あなたは私に遭遇することができるネットワークエラーのすべてを処理しようとしたときにいくつかの良い習慣があるかもしれないものにいくつかのガイダンスを与えることはできますか?

答えて

2

まず、考えられるすべてのネットワークエラーを特別に処理することは非常に難しいと思います。既に知っているように束がありますので、状態のグループを扱うために少し一般的にする方がはるかに簡単です。あなたはこのようなあなたの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を処理する場合がありますおそらくユーザに知らせることができます。そのため、switchステートメントにそのステートメントを独自のケースとして追加し、問題をユーザーに知らせるコードを呼び出してください。

+0

新しいアイデアを得ました。 – NSPratik

関連する問題