サービスのバックエンドとのすべての通信を行うネットワーク マネージャー クラスがあります。私は、ネットワーク リクエストが失敗する可能性がある場合に、ユーザーに優れたエクスペリエンスを提供できるように熱心に取り組んでいます。
現在、ネットワーク マネージャー クラスは、バックエンドで認証するための要求を行います。
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...
}
発生する可能性のあるすべてのネットワーク エラーを処理しようとする場合に、どのような良い方法があるかについて、いくつかのガイダンスを教えていただけますか?