Deadlock zwischen einer dispatch_sync in der Hauptwarteschlange und executeFetchRequest: error:

8

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:

%Vor%

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:

%Vor%

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() :

aufgerufen wird %Vor%

fetchObjectsForEntityName:onlyIDs:withPredicate: sieht so aus:

%Vor%     
leftspin 21.04.2012, 08:31
quelle

2 Antworten

0

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.

    
Jody Hagins 21.04.2012 16:31
quelle
0

Ü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

ändern     
skyylex 23.03.2015 11:09
quelle