2011-01-05 3 views
1

Ich habe eine Core Data-Datenbank von etwa 500 Objekten. Diese Objekte sind "Karten", die vom Benutzer betrachtet und geändert werden. Wenn ein Benutzer die Karte ändert, ändert sich ein Attribut namens 'groupNumber'.Das Laden von Datenobjekten in ein NSArray verursacht einen langsam langsamen Start

Die Reihenfolge dieser Karten in jeder Gruppe ist sehr wichtig und wird vom Benutzer bestimmt. Ich lade die Datenbankobjekte in ein Array. Wenn ein Benutzer eine Änderung vornimmt, speichere ich die Reihenfolge des Arrays mithilfe des Attributs 'title' in einem Verzeichnis.

Mein Problem kommt, wenn die App neu gestartet wird. Ich muss das Gruppenarray in der Reihenfolge laden, in der es gespeichert wurde. Aber wenn ich den PLIST verwende, um eine Abrufanforderung auszuführen, ist es schmerzhaft langsam.

Der langsame Code ist:

// get array from plist sorted by 'title' 
NSMutableArray *group1Temp = [plistData objectForKey:@"group1ArrayData"]; 

for (int i = 0; i < [group1Temp count]; i++) { 
    // set predicate to 'title' attribute 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", [group1Temp objectAtIndex:i]]; 

    // load filtered database object into temp array 
    NSArray *temp = [self.vocabDeckArray filteredArrayUsingPredicate:predicate]; 

    [self.group1Array addObjectsFromArray:temp]; 
} 

Wenn diese 500-mal ausgeführt wird, ist es einfach zu langsam ist. Wenn ich ein NSArray der Datenbankobjekte selbst in einem Plist speichern könnte, müsste ich keine Prädikatssuche durchführen, aber es scheint, dass ich das nicht tun kann.

Ich denke meine gesamte Vorgehensweise war falsch. Wie kann ich die Reihenfolge eines Arrays von Datenbankobjekten schneller speichern/laden? Ist das Laden von Datenbankobjekten in ein Array selbst eine schlechte Übung?

Danke für jede Hilfe!

Antwort

1

Das gesamte vocabDeckArray zu durchlaufen und es einmal für jedes Objekt in group1Temp zu filtern ist sehr ineffizient. Es gibt eine Reihe von Möglichkeiten, wie Sie diese sortierte Datei in weniger als 0 (n^2) wiederherstellen können.

Eine einfache Option könnte sein, ein Wörterbuch mit den Titeln des Objekts als Schlüssel und ihrer Position im Array als Werte zu speichern. Auf diese Weise können Sie ein Array bekannter Länge konstruieren und jedes Objekt in vocabDeckArray an die richtige Position in einem einzigen Durchgang setzen (erstes Objekt von vocabDeckArray, suchen, wo in group1Array aus dem Wörterbuch, in group1Array einfügen, weiter zum nächsten Objekt). Das ist immer noch nicht besonders schnell, aber es scheint eine minimale Änderung Ihres derzeitigen Verhaltens zu sein.

Zusätzlich berücksichtigen Sie die Anzahl der Methodenaufrufe innerhalb Ihrer Schleife. self.vocabDeckArray und self.group1Array sind Methodenaufrufe, die Sie bei jeder Iteration Ihrer Schleife ausführen, obwohl sie immer dieselben Objekte zurückgeben. Wenn Sie stattdessen lokale Variablen beibehalten, die auf diese Objekte verweisen, würden Sie bei jeder Iteration den Overhead von zwei Methodenaufrufen sparen.

+0

Ich tat genau so, wie Sie gesagt haben, mit der Ausnahme, dass Sie nur ein Array von Objekttiteln anstelle eines Wörterbuchs speichern. Sie haben mir viel Arbeit erspart und die App lädt jetzt in 3 Sekunden. Vielen Dank. – shohaku

Verwandte Themen