2010-06-21 8 views
12

Ich arbeite an einer Anwendung, die von Core Data unterstützt wird. Momentan speichere ich den Objektkontext als und wenn ich eine Entity zum Kontext hinzufüge oder lösche. Ich fürchte, es wird die Leistung beeinträchtigen, also habe ich überlegt, die Speicherung zu verzögern. In der Tat könnte ich den ganzen Weg verzögern, bis die Anwendung beendet wird. Ist es zu riskant, die Daten nur zu speichern, wenn die Anwendung geschlossen wird? Wie oft sollte ich den Objektkontext aufrufen?Wie oft sollte ich in Core Data speichern?

Ich dachte daran, einen separaten Thread mit dem Speichern zu behandeln: Es wird auf einem Semaphor warten. Jedes Mal, wenn ein Teil der Anwendung eine helper/util-Methode zum Speichern der Core-Daten aufruft, wird der Semaphor dekrementiert. Wenn es auf Null ist, speichert der "Save thread" einmal und speichert den Semaphor auf eine, sagen wir, 5, und dann wieder schlafen.

Eine gute Empfehlung? Danke!

Antwort

9

Sie sollten häufig speichern. Die tatsächliche Leistung der Sicherungsoperation hat viel damit zu tun, welchen persistenten Speichertyp Sie verwenden. Da binäre und XML-Speicher atomar sind, müssen sie bei jedem Speichern vollständig auf den Datenträger geschrieben werden. Wenn Ihr Objektgraph wächst, kann dies Ihre Anwendung wirklich verlangsamen. Auf der anderen Seite ist der SQLite-Speicher viel einfacher inkrementell zu schreiben. Während also einiges über die Objekte, die Sie speichern, geschrieben wird, ist der Overhead viel geringer als bei den Typen der Atomspeicher. Speichervorgänge, die nur wenige Objekte betreffen, sind immer schnell, unabhängig von der Gesamtgröße des Objektdiagramms.

Das heißt, wenn Sie Daten in einer Schleife importieren, sagen wir, ich würde bis zum Ende der vollständigen Operation warten, anstatt zu speichern, anstatt bei jeder Iteration zu speichern. Ihr primäres Ziel sollte sein, Datenverlust zu vermeiden. (Ich habe festgestellt, dass die Benutzer das nicht so sehr mögen!) Die Leistung sollte knapp an zweiter Stelle liegen. Möglicherweise müssen Sie etwas arbeiten, um die Häufigkeit des Sparens mit der Leistung auszugleichen, aber die Lösung, die Sie oben skizziert haben, scheint übertrieben zu sein, es sei denn, Sie haben ein spezifisches und signifikantes Leistungsproblem festgestellt.

+0

Danke für die schnelle Antwort. Meine Objekte sind nicht riesig, aber das Objekt ist ein bisschen kompliziert. Der zugrunde liegende Speicher ist SQLite, also sollte es, wie Sie sagten, ziemlich gut sein. Es gibt ein zusätzliches Problem, das ich vor kurzem begegnete: Ich erstelle ein Entitätsobjekt im Kontext und speichere es. In einem kurzen Moment, wenn ich diese Entität lösche (später mit einem FetchedResultsController abgerufen), würde ich einen Fehler bekommen, der etwas mit Interner Konsistenz zu tun hat. Ich denke, es ist, weil der Kontext das Objektdiagramm im Speicher nicht aktualisiert hat? – Justin

+1

Ich würde hinzufügen, dass Sie Ihre tatsächliche speichern Frequenz eine Variable oder eine '# definieren möchten, so dass, wenn Sie testen, können Sie Ihre Häufigkeit speichern und die Ergebnisse in Instrumenten Feinabstimmung. –

0

Der beste Weg, denke ich, ist nach jedem Objekt zu speichern. Wenn etwas passiert, wie zum Beispiel ein plötzlicher Absturz, wird nichts verloren gehen.

Einige Leistungsverbesserungen, wenn Sie viele Objekte hinzufügen, ist Batch. Fügen Sie dem Kontext alle Objekte zum Speichern hinzu. Dies ist beispielsweise nützlich, wenn Sie viele Objekte in einer Schleife hinzufügen. Ihre Idee ist ähnlich, aber es könnte eine lange Zeit zwischen den Speichern sein, in denen das Programm abstürzen könnte.

Ich denke nicht, dass das Hinzufügen eines einzelnen Objekts ein Leistungsproblem wäre. Wie groß sind Ihre Objekte, enthalten sie viele Daten?

+0

Speichern Sie NIE nach jedem Absturz. Das tötet die Leistung tot. –

+1

Sparen Sie nach jedem Unfall? Ich denke, das ist ein Tippfehler. Sicher, wenn der Benutzer die Speichervorgänge diktiert, indem er Objekte erstellt, konnte der Benutzer Objekte nicht schnell genug erstellen, um die Anwendung zu verlangsamen. Wenn Sie denken, dass es Ihre Anwendung verlangsamt genug, um das Risiko einzugehen, nicht genug zu sparen. Bitte geben Sie Beweise, alle meine Benchmarks sind akzeptabel. –

Verwandte Themen