2009-08-25 3 views
1

Ich habe einen launchd-Daemon, der mit Hilfe von NSOperationQueue so oft Daten über einen Webdienst hochlädt.Persistente Elemente, die über den Webdienst auf die Festplatte hochgeladen werden

Ich muss in der Lage sein, diese Daten zu persistieren, so dass sie später im Falle eines Fehlers auch zwischen den Sitzungen erneut hochgeladen werden können (zum Beispiel bei einem Computerausfall).

Dies ist keine Hochlast-Anwendung, es empfängt wahrscheinlich Elemente intermittierend nicht mehr als 1 oder 2 pro Minute, oft mit mehreren Stunden Lücken dazwischen.

Meine anfängliche Implementierung ohne diese Beharrlichkeit an seinem Platz ist wie folgt:

  1. Daemon empfängt Daten.
  2. Daemon analysiert Daten in ein Objekt vom Typ MyDataObject.
  3. Daemon erstellt eine Instanz der NSOperation-Unterklasse mit MyDataObject als Objekt zum Hochladen und fügt es seiner NSOperationQueue hinzu.
  4. NSOperationQueue geht durch und lädt MyDataObject über Web-Service, wie es möglich ist.

Dieser Teil funktioniert alles gut. Der Teil, den ich jetzt hinzufügen möchte, ist die Persistenz im Falle eines Web-Service-Versagens, Herunterfahren des Computers, etc.

Es scheint, als könnte ich ein NSMutableArray von MyDataObjects zusammen mit NSKeyed (Un) archiver verwenden, das alle Elemente enthält, die hatten noch nicht hochgeladen und Beobachtung der -isFinished Schlüssel aller Operationen, um Elemente aus dem Array zu entfernen, aber es scheint wie es sollte eine einfachere Möglichkeit zu tun ist, mit weniger Platz für Dinge, die schief gehen, vor allem so weit wie Thread Sicherheit geht.

Kann mir jemand in die richtige Richtung zeigen?

Antwort

1

Sie könnten zwei Operationen pro Element hinzufügen. Der erste würde den Artikel im lokalen Speicher speichern und der zweite würde vom ersten Speicher abhängen und würde den Artikel bei Erfolg aus dem lokalen Speicher entfernen.

Wenn Sie dann Elemente aus lokalem Speicher wiederherstellen möchten, erstellen Sie nur die Operationen "Store-to-the-Cloud", nicht die Vorgänge "Store-lokal". Wie zuvor entfernen sie die Elemente nur dann aus dem lokalen Speicher, wenn sie erfolgreich sind, und wenn sie nicht erfolgreich sind, lassen sie die Elemente im lokalen Speicher für den nächsten Versuch.