Ich habe in dem von Apple bereitgestellten Beispielcode gesehen, wie Sie mit Core Data-Fehlern umgehen sollen. Dh:
NSError *error = nil;
if (![context save:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Aber niemals Beispiele dafür, wie Sie es implementieren sollten .
Hat jemand einen tatsächlichen "Produktions" -Code, der die obige Methode veranschaulicht (oder kann er mich darauf hinweisen)?
Vielen Dank im Voraus, Matt
iphone
core-data
error-handling
Schwanken
quelle
quelle
Antworten:
Niemand wird Ihnen Produktionscode anzeigen, da dieser zu 100% von Ihrer Anwendung abhängt und davon, wo der Fehler auftritt.
Persönlich habe ich dort eine Assert-Erklärung eingefügt, da dieser Fehler in 99,9% der Fälle in der Entwicklung auftritt und wenn Sie ihn dort beheben, ist es höchst unwahrscheinlich, dass Sie ihn in der Produktion sehen.
Nach der Bestätigung würde ich dem Benutzer eine Warnung anzeigen, ihn wissen lassen, dass ein nicht behebbarer Fehler aufgetreten ist und dass die Anwendung beendet wird. Sie können dort auch einen Klappentext einfügen und sie bitten, sich an den Entwickler zu wenden, damit Sie dies hoffentlich nachverfolgen können.
Danach würde ich abort () dort belassen, da es die App "zum Absturz bringt" und einen Stack-Trace generiert, den Sie hoffentlich später verwenden können, um das Problem aufzuspüren.
quelle
-save:
. All diese Bedingungen treten auf, lange bevor Ihr Code diesen Punkt erreicht.-save:
Aufruf von behandelt werden kann.Dies ist eine generische Methode, mit der ich Validierungsfehler auf dem iPhone behandeln und anzeigen konnte. Aber Marcus hat Recht: Sie möchten wahrscheinlich die Nachrichten optimieren, um benutzerfreundlicher zu sein. Dies gibt Ihnen jedoch zumindest einen Ausgangspunkt, um zu sehen, welches Feld nicht validiert wurde und warum.
Genießen.
quelle
Ich bin überrascht, dass hier niemand den Fehler so behandelt, wie er behandelt werden soll. Wenn Sie sich die Dokumentation ansehen, werden Sie sehen.
Wenn ich also beim Einrichten des Kerndatenstapels einen Fehler finde, tausche ich den rootViewController von UIWindow aus und zeige eine Benutzeroberfläche, die dem Benutzer deutlich macht, dass sein Gerät möglicherweise voll ist oder die Sicherheitseinstellungen zu hoch sind, damit diese App funktioniert. Ich gebe ihnen auch die Schaltfläche "Erneut versuchen", damit sie versuchen können, das Problem zu beheben, bevor der Kerndatenstapel erneut versucht wird.
Zum Beispiel könnte der Benutzer Speicherplatz freigeben, zu meiner App zurückkehren und die Schaltfläche "Erneut versuchen" drücken.
Behauptungen? "Ja wirklich?" Zu viele Entwickler im Raum!
Ich bin auch überrascht von der Anzahl der Online-Tutorials, in denen nicht erwähnt wird, wie ein Speichervorgang auch aus diesen Gründen fehlschlagen kann. Sie müssen also sicherstellen, dass ein Speicherereignis ÜBERALL in Ihrer App fehlschlagen kann, da das Gerät NUR DIESE MINUTE mit Ihren Apps voll ist. Speichern Speichern Speichern Speichern.
quelle
Ich fand diese allgemeine Speicherfunktion eine viel bessere Lösung:
Wenn ein Speichervorgang fehlschlägt, wird Ihr NSManagedObjectContext zurückgesetzt, was bedeutet, dass alle Änderungen zurückgesetzt werden, die seit dem letzten Speichern im Kontext vorgenommen wurden . Sie müssen also sorgfältig aufpassen, um Änderungen mit der oben genannten Speicherfunktion immer so früh und regelmäßig wie möglich beizubehalten, da Sie sonst leicht Daten verlieren könnten.
Zum Einfügen von Daten kann dies eine lockerere Variante sein, mit der andere Änderungen weitergeführt werden können:
Hinweis: Ich verwende CocoaLumberjack für die Protokollierung hier.
Jeder Kommentar zur Verbesserung ist mehr als willkommen!
BR Chris
quelle
Ich habe eine Swift-Version der nützlichen Antwort von @JohannesFahrenkrug erstellt, die nützlich sein kann:
quelle