Ich versuche, eine URLSession
Anforderung in Swift 3 auszuführen . Ich führe diese Aktion in einer separaten Funktion aus (um den Code für GET und POST nicht separat zu schreiben) URLSessionDataTask
und gebe den Erfolg und Misserfolg bei Abschlüssen zurück und behandle ihn. So ähnlich wie-
let task = URLSession.shared.dataTask(with: request) { (data, uRLResponse, responseError) in
DispatchQueue.main.async {
var httpResponse = uRLResponse as! HTTPURLResponse
if responseError != nil && httpResponse.statusCode == 200{
successHandler(data!)
}else{
if(responseError == nil){
//Trying to achieve something like below 2 lines
//Following line throws an error soo its not possible
//var errorTemp = Error(domain:"", code:httpResponse.statusCode, userInfo:nil)
//failureHandler(errorTemp)
}else{
failureHandler(responseError!)
}
}
}
}
Ich möchte die Fehlerbedingung in dieser Funktion nicht behandeln und möchte einen Fehler unter Verwendung des Antwortcodes erzeugen und diesen Fehler zurückgeben, um ihn zu behandeln, wo immer diese Funktion aufgerufen wird. Kann mir jemand sagen, wie ich das anstellen soll? Oder ist dies nicht der "schnelle" Weg, um mit solchen Situationen umzugehen?
ios
swift3
nsurlsession
Rikh
quelle
quelle
NSError
anstelle vonError
in der Deklaration (var errorTemp = NSError(...)
)Error
Protokoll anpassenAntworten:
Sie können ein Protokoll erstellen, das dem Swift-
LocalizedError
Protokoll entspricht, mit folgenden Werten:Dies ermöglicht es uns dann, konkrete Fehler wie folgt zu erzeugen:
quelle
In Ihrem Fall besteht der Fehler darin, dass Sie versuchen, eine
Error
Instanz zu generieren .Error
in Swift 3 ist ein Protokoll, mit dem ein benutzerdefinierter Fehler definiert werden kann. Diese Funktion ist speziell für reine Swift-Anwendungen vorgesehen, die unter verschiedenen Betriebssystemen ausgeführt werden.In der iOS-Entwicklung ist die
NSError
Klasse weiterhin verfügbar und entspricht demError
Protokoll.Wenn Sie diesen Fehlercode nur weitergeben möchten, können Sie ihn problemlos ersetzen
mit
Überprüfen Sie andernfalls die Antwort von Sandeep Bhandari , wie Sie einen benutzerdefinierten Fehlertyp erstellen
quelle
Error cannot be created because it has no accessible initializers
.Error
, aberNSError
. NatürlichError
wirft die Verwendung einen Fehler.Sie können Aufzählungen erstellen, um mit Fehlern umzugehen :)
und erstellen Sie dann eine Methode in enum, um den http-Antwortcode zu erhalten und den entsprechenden Fehler zurückzugeben :)
Aktualisieren Sie schließlich Ihren Fehlerblock, um einzelne Parameter vom Typ RikhError zu akzeptieren :)
Ich habe eine detaillierte Anleitung, wie die Umstrukturierung der traditionellen Objective - C auf Basis der objektorientierten Netzwerk - Modell der modernen Protokoll Modell Oriented mit swift3 hier https://learnwithmehere.blogspot.in Werfen Sie einen Blick :)
Ich hoffe es hilft :)
quelle
Sie sollten das NSError-Objekt verwenden.
let error = NSError(domain:"", code:401, userInfo:[ NSLocalizedDescriptionKey: "Invalid access token"])
Wandeln Sie dann NSError in das Fehlerobjekt um
quelle
Einzelheiten
Lösung zum Organisieren von Fehlern in einer App
Verwendung
quelle
Implementieren Sie LocalizedError:
Beachten Sie, dass das einfache Implementieren von beispielsweise Fehler, wie in einer der Antworten beschrieben, fehlschlägt (zumindest in Swift 3) und das Aufrufen von localizedDescription zu der Zeichenfolge "Der Vorgang konnte nicht abgeschlossen werden. (.StringError error 1.) führt. ""
quelle
struct StringError : LocalizedError { public let errorDescription: String? }
und das einfach alsStringError(errorDescription: "some message")
Erstellen Sie ein NSError-Objekt, typisieren Sie es in Error und zeigen Sie es an einer beliebigen Stelle an
quelle
Ich denke immer noch, dass Harrys Antwort die einfachste und vollständigste ist, aber wenn Sie etwas noch Einfacheres brauchen, dann verwenden Sie:
Und benutze es so:
quelle
Ich weiß, dass Sie mit einer Antwort bereits zufrieden sind, aber wenn Sie daran interessiert sind, den richtigen Ansatz zu kennen, kann dies für Sie hilfreich sein. Ich würde es vorziehen, den http-Antwort-Fehlercode nicht mit dem Fehlercode im Fehlerobjekt zu mischen (verwirrt? Bitte lesen Sie weiter ...).
Die http-Antwortcodes sind Standardfehlercodes für eine http-Antwort, die allgemeine Situationen definieren, in denen eine Antwort empfangen wird. Sie variieren von 1xx bis 5xx (z. B. 200 OK, 408 Zeitüberschreitung bei Anforderungen, 504 Gateway-Zeitüberschreitung usw. - http://www.restapitutorial.com/). httpstatuscodes.html )
Der Fehlercode in einem NSError-Objekt bietet eine sehr spezifische Identifikation für die Art von Fehler, die das Objekt für eine bestimmte Domäne von Anwendung / Produkt / Software beschreibt. Beispielsweise verwendet Ihre Anwendung möglicherweise 1000 für "Entschuldigung, Sie können diesen Datensatz nicht mehr als einmal am Tag aktualisieren" oder 1001 für "Sie benötigen eine Manager-Rolle, um auf diese Ressource zuzugreifen" ... die für Ihre Domain / Anwendung spezifisch sind Logik.
Bei einer sehr kleinen Anwendung werden diese beiden Konzepte manchmal zusammengeführt. Aber sie sind völlig anders, wie Sie sehen können, und sehr wichtig und hilfreich beim Entwerfen und Arbeiten mit großer Software.
Es gibt also zwei Techniken, um den Code besser zu handhaben:
1. Der Abschlussrückruf führt alle Überprüfungen durch
2. Ihre Methode entscheidet über die Erfolgs- und Fehlersituation und ruft dann den entsprechenden Rückruf auf
Viel Spaß beim Codieren :)
quelle
quelle