Problemstellung
Ich habe Probleme, Server-Seite Daten zu speichern asynchron.IOS Core Data asynchrone Spar
Struktur
ich die folgende Struktur NSManagedObjectContext in der Reihenfolge der Eltern auf das Kind bin mit:
- writerManagedObjectContext (NSPrivateQueueConcurrencyType)
- masterManagedObjectContext (NSMainQueueConcurrencyType)
- backgroundManagedObjectContext (NSPrivateQueueConcurrencyType)
-Code
ich den folgenden Code verwenden fein zu speichern Daten
[backgroundManagedObjectContext performBlock:^{
[backgroundManagedObjectContext save:nil];
[masterManagedObjectContext performBlock:^{ // Starts blocking UI from here
[masterManagedObjectContext save:nil];
[writerManagedObjectContext performBlock:^{
[writerManagedObjectContext save:nil];
}]
}]
}]
Problem
Der Code speichert. Die backgroundManagedObjectContext
speichert auch asynchron. Sowohl masterManagedObjectContext
als auch writerManagedObjectContext
können jedoch nicht asynchron gespeichert werden und blockieren den UI-Thread. (Ich weiß, es blockiert den UI-Thread, weil ich versuchte, Aktionen auszuführen, die nichts mit Core Data zu tun haben, und sie wurden auch gesperrt. Dies ist kein Fall von dem persistenten Koordinator nicht zugänglich ist)
Fragen
- Was wäre der Grund, warum der obige Code den Hauptthread blockiert?
- Bin ich richtig in der Annahme, dass ich den obigen Code von überall aufrufen kann, da die
save
in jedem entsprechenden Thread/Kontext aufgerufen wird?
Jede Hilfe würde sehr geschätzt werden.
bearbeiten
http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/
Anscheinend kommt der Frost aus dem Versuch, an die Mutter NSManagedObjectContext zu propagieren. Der Artikel scheint sich der Tatsache zu entziehen, dass es unmöglich ist, eine wirklich asynchrone Speicherung im Hauptkontext zu haben.
Die Daten wurden stark verknüpft, 5 MB, und dauerte ungefähr 40s, um PSC zu speichern. Ich denke nicht, dass ich eine parallele Struktur wie im Post beschrieben verwenden werde, da die Codebasis bereits so groß ist wie sie ist. Ich würde mich über alle Strategien freuen, die ich nutzen kann, um diesen Freeze zu verringern.
Ich verwende bereits verschachtelte MOCs, wie die Struktur zeigt. Meine Frage ist, warum das Speichern nicht asynchron ist, obwohl eine verschachtelte MOC-Struktur verwendet wird. – jrhee17
Ich erkannte, dass Sie nach dem erneuten Lesen Ihres Posts verschachtelte Kontexte verwendet haben. Ich werde meine Antwort bearbeiten. Sie sollten es vermeiden, 'nil' an den 'save'-Fehlerhandler zu übergeben. Sie möchten auf Fehler reagieren können. Versuchen Sie, nach Fehlern zu suchen, und sehen Sie, ob das Ihre Hauptwarteschlange blockiert. Auch Sie erwähnten "Serverseite". Verwenden Sie Core Data iCloud-Synchronisierung? – jp2g
Ich benutze meinen eigenen Server, aber ehrlich gesagt ist der Server irrelevant. Grundsätzlich analysiere ich JSON-Daten und füge sie in Core Data ein. Ich mache Fehlerbehandlung - der Code oben dient nur dazu, zu veranschaulichen, wie mein Code aussieht. – jrhee17