Ich bin dispatch_sync()
'einen Block in der Hauptwarteschlange. In diesem Block wird schließlich ein Aufruf von executeFetchRequest:error:
ausgeführt. Manchmal führt dies zu einem Deadlock.
Hier ist Thread 1, der den Block zeigt, der im Haupt-Thread aufgerufen wurde, und dann den Aufruf von executeFetchRequest:error:
Ich kann sehen, dass executeFetchRequest:error:
die Sperre von NSPersistentStoreCoordinator
blockiert, aber ich weiß nicht, wer sie gerade gesperrt hat.
Das ursprüngliche dispatch_sync()
kommt von einem anderen Thread, und hier ist das, falls es wichtig ist:
Hier ist der Code bis zum ursprünglichen Versand:
%Vor% contextForID:contextID managedObjectContext:
tut wirklich nichts mit den Kerndaten, bis es executeFetchRequest:error:
aufruft.
AKTUALISIEREN
Hier sind die restlichen Stack-Traces. AFAIK machen sie nichts Interessantes, obwohl ich mich vielleicht irren kann.
%Vor% Und hier ist contextID:managedObjectContext:
, was die Methode ist, die in dispatch_sync()
:
fetchObjectsForEntityName:onlyIDs:withPredicate:
sieht so aus:
Um mehr Hilfe zu geben, müssen Sie den Code für alle Methoden in den Stack-Traces zusammen mit den Zeilennummern anzeigen. Auf diese Weise kann es korreliert werden.
Außerdem sieht es so aus, als hättest du viele Threads. Ich denke, du wirst die anderen untersuchen müssen, um zu sehen, was passiert.
Sie müssen sehr vorsichtig sein, wenn Sie eine Synchronisierungsoperation aufrufen, insbesondere wenn sie von anderen Synchronisierungsvorgängen aufgerufen werden kann.
Überprüfen Sie Ihre NSManagedObjectContext
für concurrencyType
. Anscheinend hat Ihr Kontext NSMainQueueConcurrencyType
, wodurch alle Anfragen im Hauptthread ausgeführt werden. Von Apple Referenz :
NSMainQueueConcurrencyType
Gibt an, dass der Kontext der Hauptwarteschlange zugeordnet wird.
Wenn ich Recht habe, müssen Sie den Typ in NSPrivateQueueConcurrencyType
Tags und Links objective-c iphone ios core-data deadlock