NSManagedObjectContext: exception breakpoint Stoppt bei speichern: Methode, aber keine log - /Absturz/Fehler
Bin ich mit CoreData in einer multi-threaded-iOS-app, und alles scheint gut zu funktionieren - es sei denn, ich schalte die Ausnahme Haltepunkt in XCode. Immer wenn ich einige CoreData-Arbeit, der Haltepunkt hält an der save:
-Methode auf NSManagedObjectContext
- aber die NSError ist null danach. Ich habe auch nichts in der log (Ausnahme: Catchpoint 2 (exception thrown).
), die app stürzt nicht ab... es ist Also ziemlich schwer zu sagen, was falsch läuft.
Ist der einzige Hinweis den ich habe ist, dass ich ein einzelnes Objekt in updatedObjects:
in meinem NSManagedObjectContext
- aber es scheint nichts falsch mit ihm.
Meine Frage ist sehr ähnlich zu diese Frage auf stackoverflow
, aber die einzige Antwort, es hilft mir nicht; ich bin mir ziemlich sicher, dass ich habe, alles abgedeckt, es.
Was könnte hier falsch sein? Oder gibt es andere Möglichkeiten, um einige Fehler Informationen?
Vielen Dank!
BEARBEITEN: anzeigen-code ist ziemlich schwierig. Ich bin be-Objekte mit objectID, Bearbeiten und speichern Sie Sie in den Kontext zugewiesen ist, um den aktuellen thread. Ich habe bereits überprüft - der Kontext ist immer richtig für den aktuellen thread; jeder thread hat seinen eigenen Kontext, das sollte nicht das problem sein. Es wäre auch hilfreich, wenn nur jemand könnte mir sagen, wie man mehr Informationen aus, die Fehler/Ausnahme - oder, wenn ich zu kümmern, nachdem alle. Es scheint mir, als wenn die Ausnahme abgefangen innerhalb der save-Methode, so wahrscheinlich sein ein "normales" Verhalten?
- Können Sie Schuh etwas code?
- zeigt code ist unmöglich, fürchte ich - aber siehe mein edit, danke...
- Sie sind mit dem gleichen managedObjectContext unter-threads? (Zusammenhang kann nicht geteilt werden zwischen threads)
- Nein, ich bin mir ziemlich sicher, dass jeder thread hat seinen eigenen managedObjectContext. Alles, was ich bin-sharing ist die managedObjectID, die nicht zusammenhängen und keine objectModels.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist normalen Verhalten. CoreData verwendet eine auf exception werfen & handling intern für einige der Programm-Ablauf. Ich Sprach mit der CoreData Menschen über diese. Es mag seltsam wirken, aber das ist eine design Entscheidung, die Sie gemacht vor langer Zeit.
Getroffen, wenn Sie die Ausnahme, stellen Sie sicher, dass es keinen gibt der Sie Ihren code in das backtrace zwischen Ihren Anruf
-[NSManagedObjectContext save:]
und die exception wird geworfen. Aufruf-save:
ist sehr wahrscheinlich, rufen Sie wieder in Ihren code ein, z.B. wenn Sie beobachtenNSManagedObjectContextObjectsDidChangeNotification
, und wenn Sie tun böse Dinge, wenn Sie die Handhabung der Benachrichtigung, offensichtlich bist du Schuld.Wenn Sie verlassen die
-save:
- Methode und der return value istYES
ist alles gut.Bitte beachten Sie, dass Sie sollten überprüfen Sie den Rückgabewert, tun nicht Verwendung
error != nil
zu prüfen, ob ein Fehler. Den richtigen check ist:-com.apple.CoreData.ConcurrencyDebug 1
ohne Probleme und plötzlich Stoppt der code an der exakt gleichen Stelletry context.save()
. Es scheint nicht zu einem thread-Thema; jedoch, wie kann ich sicher sein, dass es in der Tat NICHT ein thread-Thema? Der code scheint zu funktionieren, wenn der debug-Schalter ausgeschaltet ist.Vermeiden Sie diesen unnötigen Pausen, wie andere haben darauf hingewiesen, das ist normal, CoreData-Verhalten (aber sehr ärgerlich!)
objc_exception_throw
(BOOL)(! (BOOL)[[(NSException *)$eax className] hasPrefix:@"_NSCoreData"])
$eax ist die korrekte register für den simulator, $r0 funktioniert auf Geräten. Sie können erstellen Sie zwei separate Haltepunkte und aktivieren/deaktivieren Sie diese gegebenenfalls.
Sehen Ignorieren von bestimmten Ausnahmen, die bei der Verwendung von Xcode ist Alles Ausnahmen Haltepunkt für die original-Antwort
Ich hatte ein ähnliches problem. Irgendwann habe ich herausgefunden, das problem:
Ich fügte ein Beobachter NSManagedObjectContextDidSaveNotification, bekam freigegeben ohne entfernen sich aus dem notification center. Wenn Ihr Speicher zugewiesen bekam, um ein anderes Objekt, das notification center versucht, indem er auf das Objekt und hob eine Ausnahme, weil Sie konnte nicht finden, den richtigen Selektor. Diese Ausnahme war "unsichtbar" für einige Grund, aber verursacht CoreData zu erhöhen, seine eigene Ausnahme.
Einer gut Platzierten removeObserver: nennen das problem behoben.
Hoffe, dies kann helfen, jemand anderes, trifft auf diese situation.
Ich hatte ein ähnliches Problem auftreten, in meinem code. Ich entdeckte schließlich, dass das Problem aufgrund von meinem Modell haben sich geändert, und die
EncryptedCoreData
NSPersistentStoreCoordinator
war ich mit war nicht für die automatische migration, wie ich schon erwartet hatte, mit MagicalRecord in der Vergangenheit.Das einzige symptom war dieser Haltepunkt, ohne irgendwelche anderen Nachrichten. Es gelöst wurde (vorübergehend) durch löschen und Neuinstallation der app und dauerhaft durch hinzufügen von Modell-Varianten und der entsprechenden Taste (
NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true
) zu meiner stack-setup.Kämpfte ich mit dem gleichen problem und was ich gefunden habe ist der Koordinator wird eine exception werfen, wenn es einen merge-problem. Ich habe entfernt mein merge policy (default ist der Fehler) und nach, dass der Fehler Zeiger ist nicht mehr null, wenn Sie anrufen, speichern. Auch gab mir Vertrauen, dass mein code ist ok.