Core Data-Kindkontexte, die Beziehungen nicht vorab abrufen

8

Ich habe den Core Data-Debugger -com.apple.CoreData.SQLDebug 1 in meinem App-Schema aktiviert und die folgenden Ergebnisse für eine Entität namens Category mit einer Beziehungseinheit namens Image:

erhalten

FetchRequest im Hauptkontext:

%Vor%

Das Konsolenprotokoll zeigt an, dass keine Fehler erfüllt sind - das erwartete Verhalten seit dem Festlegen der Bildbeziehung für das Vorabholen.

Dieselbe Anforderung für einen untergeordneten Kontext:

%Vor%

In diesem Fall zeigt die Konsole an, dass Kerndaten Fehler für jedes Bild (4 davon) erfüllen. Ist das ein Fehler, erwartetes Verhalten oder fehlt mir etwas?

    
RunLoop 01.12.2015, 10:24
quelle

1 Antwort

4

Experiment:

Ich habe Ihr Szenario in einer Testanwendung repliziert und komme zu der gleichen Schlussfolgerung: Der Vorabruf findet im Hintergrundthread nicht statt. Anmelden:

%Vor%

Analyse:

Laut Dokumentation von NSFetchRequest , es wird erklärt, dass der Prefetching angeboten wird, um spezifische Performance-Herausforderungen zu adressieren. Es wird wie folgt beschrieben (meine Betonung):

  

Der Vorabruf ermöglicht es Core Data, verwandte Objekte in einem einzigen Abruf (pro Entität) zu erhalten, anstatt für jeden einzelnen Datensatz nachfolgenden Zugriff auf den Speicher zu erhalten, wenn ihre Fehler ausgelöst werden. Wenn Sie beispielsweise eine Mitarbeiter-Entität mit einer Beziehung zu einer Abteilungs-Entität abholen, wenn Sie alle Mitarbeiter abholen und dann für jeden Ausdruck ihren Namen und den Namen der Abteilung, zu der sie gehören, eingeben, wird möglicherweise ein Fehler ausgelöst jedes einzelne Department-Objekt (für weitere Details siehe Core Data Performance in Core Data Programming Guide). Dies kann einen erheblichen Overhead darstellen. Sie können dies vermeiden , indem Sie die Abteilungsbeziehung im Employee Fetch ... vorlesen.

Aus dem Wortlaut folgt, dass dies ein nicht ein notwendiges Gerät ist, um die Leistung zu verbessern. Dies würde erklären, warum es nicht in einem Hintergrundthread implementiert ist: Das in der Diskussion beschriebene Leistungsproblem scheint auf ein typisches Szenario mit UI-Updates hinzudeuten. Dies verdeutlicht meines Erachtens die Absicht dieses Features.

Wenn Sie bereits in einem Hintergrundthread sind, ist diese Art von Performance-Tuning sicherlich weniger kritisch und der übliche Fehlermechanismus kann die notwendige Optimierung adäquat handhaben. Die Eigenschaft relationshipKeyPathsForPrefetching wird daher auf ihren Standardwert, ein leeres Array, zurückgesetzt.

    
Mundi 07.12.2015 15:01
quelle

Tags und Links