Manchmal (selten aber tritt auf) bekam ich den Fehler Object has been deleted or invalidated.
, wenn ich versuchte, mein Modellobjekt mit einer Eigenschaft oder innerhalb von AFnetworking Block zu modifizieren. Kann mir jemand helfen zu finden, was ich falsch mache?
Fehler - Fall 1:
Code:
%Vor%Fehler - Fall 2:
Eigenschaft:
%Vor%Code:
%Vor%UIAlertView-Delegierter:
%Vor%Danke.
Manchmal (selten aber tritt auf) bekam ich den Fehler UIAlertView
, wenn ich versuchte, mein Modellobjekt mit einer Eigenschaft oder innerhalb von AFnetworking Block zu modifizieren. Kann mir jemand helfen zu finden, was ich falsch mache?
Fehler - Fall 1:
Code:
%Vor%Fehler - Fall 2:
Eigenschaft:
%Vor%Code:
%Vor%UIAlertView-Delegierter:
%Vor%Danke.
Wie in Beispiel 1 wird die Netzwerkanforderung in einer anderen Operationswarteschlange asynchron ausgeführt und ruft den Hauptthread erneut auf. Es ist sehr wahrscheinlich, dass Sie über einen Code verfügen, der in der Zwischenzeit von einer Benutzeraktion ausgelöst werden kann und das Objekt löscht gleichzeitig. Die Modellobjekt-Referenz, die Sie halten, wird automatisch aktualisiert und spiegelt das Löschen wider. Da ein gelöschtes Objekt nicht geändert werden kann, kommt es zu dem Fehler.
Auch Beispiel 2 beinhaltet Nebenläufigkeit. Ihr Code ruft zuerst das Modellobjekt ab und zeigt dann die Alarmansicht an. Während %code% angezeigt wird, wird der Haupt-Thread nicht blockiert. Theoretisch könnte gleichzeitig ein Netzwerkvorgang, der zuvor in die Warteschlange gestellt wurde, enden, der Abschlussblock könnte ausgelöst werden, ein Löschen des Modellobjekts tritt auf. Der Benutzer bestätigt die Änderungen. Ihre Implementierung des Delegaten wird aufgerufen, erwartet jedoch, dass das zuvor abgerufene Objekt noch vorhanden ist.
Eine Möglichkeit zur Vermeidung von Abstürzen besteht darin, nur einen Primärschlüssel anstelle eines vollständigen Modellobjektverweises zu speichern, der die letzten Änderungen aktualisiert und wiedergibt. Der Primärschlüssel bleibt konstant und sollte immer in der Lage sein, Ihr Objekt zu identifizieren. Sie können den Primärschlüssel später verwenden, um das Objekt direkt in Ihrer Schreibtransaktion abzurufen.
Beachten Sie, dass es in jedem Fall an Ihnen liegt zu definieren, wie sich Ihre App verhält, wenn Ihre Daten gleichzeitig geändert wurden. Sie können versuchen, das Objekt neu zu erstellen, indem Sie mehr Daten in der Kopie behalten oder das Ereignis ignorieren und das Löschen gewinnen lassen oder sicherstellen, dass keine widersprüchlichen Änderungen auftreten, indem Sie die Benutzeroberfläche angemessen einschränken. Sie müssen eine Konfliktlösungsstrategie entwickeln.
Tags und Links objective-c realm