2016-07-22 8 views
0

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:

  1. writerManagedObjectContext (NSPrivateQueueConcurrencyType)
  2. masterManagedObjectContext (NSMainQueueConcurrencyType)
  3. 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

  1. Was wäre der Grund, warum der obige Code den Hauptthread blockiert?
  2. 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.

Antwort

1

Auch wenn backgroundManagedObjectContext ein privater Warteschlangenkontext ist, werden die Änderungen bis zu masterManagedObjectContext weitergegeben, da es sich um den übergeordneten Kontext handelt. Dies könnte sein, wo es sich verschluckt. Das Zusammenführen von Änderungen aus untergeordneten Kontexten beansprucht immer noch CPU-Zeit, deren Auswirkungen in einer Warteschlange mit hohem Arbeitsaufkommen wie der Benutzeroberfläche stärker ausgeprägt sind.

Sie können immer Instrumente verwenden, um zu analysieren, was vor sich geht.

Wenn Ihr bestimmter Anwendungsfall dies zulässt, versuchen Sie, backgroundManagedObjectContext.persistentStoreCoordinator auf den gleichen Wert wie writerManagedObjectContext einzustellen und machen Sie kein Kind von masterManagedObjectContext.

Besser noch, verwenden Sie ein tolles Framework wie MagicalRecord. Schützt Sie nicht vor solchen Problemen, aber weniger Code macht die Dinge ein wenig einfacher zu debuggen.

+0

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

+0

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

+0

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