Core-Data-cloud zu synchronisieren, benötigen Sie Hilfe mit logic

Ich bin mitten in der brainstorming-eine cloud-sync-Lösung für ein Core Data app, die ich bin derzeit in der Entwicklung. Ich Plane ein open-source-code für diese, wenn Ihre getan, für jedermann, sich mit Ihren Core-Data-apps, also input aus der community auf, wie dieses system funktionieren sollte, ist sehr willkommen 🙂 Hier ist, was ich denke:

Server-Seite


Storage-Anbieter

Wie bei allen cloud-sync-Systeme, storage ist ein wichtiges Stück des Puzzles. Es gibt viele Möglichkeiten, dies zu behandeln. Könnte ich meinen eigenen server für die Lagerung, oder verwenden Sie einen Dienst wie Amazon S3, sondern weil ich bin angefangen mit $0 Kapital, in diesem moment, eine bezahlte storage-Lösung ist nicht eine praktikable option. Nach einiger überlegung habe ich beschlossen, sich mit Dropbox (einer bereits etablierten cloud-sync-Anwendung und-Speicher-Anbieter). Die Vorteile der Verwendung von Dropbox sind:

  • Es ist kostenlos (für eine begrenzte Menge an Speicherplatz)
  • Darüber hinaus zu einer storage-service, es kann auch mit cloud-sync
  • Sie kürzlich ein Objective-C SDK an, das macht es viel einfacher Schnittstelle in Mac-und iPhone-apps

Im Fall entscheide ich mich zu einem Wechsel auf andere storage-Anbieter in der Zukunft möchte ich hinzufügen, "services", um diese cloud-sync-framework, grundsätzlich so dass jemand, um eine service Klasse erstellt und die Schnittstelle mit Ihrer Wahl der storage-Anbieter, die können dann einfach eingesteckt werden in den Rahmen.

Storage-Struktur

Dies ist eine wirklich schwierige Teil, herauszufinden,, also ich brauche so viel input wie ich können hier. Ich habe darüber nachgedacht, eine Struktur wie diese:

CloudSyncFramework
======> [app name]
==========> devices
=============> (device id)
================> deviceinfo
================> changeset
==========> entities
=============> (entity name)
================> (object id)

Einer kurzen Erläuterung dieser Struktur:

  • The master "CloudSyncFramework" (name unentschlossen) Ordner enthält separate Ordner für jede app, die das framework verwendet
  • Jeder app-Ordner enthält eine Geräte - Ordner und ein Personen Ordner
  • Die Geräte Ordner enthält einen Ordner für jedes Gerät, das registriert ist, mit dem Konto. Das Gerät Ordner mit dem Namen entsprechend, um die Geräte-ID, die mit so etwas wie [[UIDevice currentDevice] uniqueIdentifier] (auf iOS) oder eine Seriennummer (Mac OS).
  • Jedes Gerät Ordner enthält zwei Dateien: deviceinfo und änderungssatz. deviceinfo enthält Informationen über das Gerät (z.B. OS-version, Letzte sync Datum, Modell, etc.) und die änderungssatz Datei enthält Informationen über Objekte, die geändert wurden, seit das Gerät zuletzt synchronisiert. Beide Dateien werden einfach NSDictionaries archiviert in Dateien mit NSKeyedArchiver.
  • Jedem Core-Data-Entität hat einen Unterordner unter dem Personen Ordner
  • Unter jedem entity Ordner, jedes Objekt gehört zu dieser Einheit eine separate Datei. Diese Datei enthält eine JSON-dictionary mit dem key-value-Paare.

Gleichzeitigen Sync

Dies ist einer der Bereiche, in denen bin ich fast völlig ahnungslos. Wie würde ich mit 2 Geräten verbinden und synchronisieren mit der cloud in der gleichen Zeit? Es scheint ein hohes Risiko der Dinge, die out-of-sync hier, oder sogar Beschädigung von Daten.

Umgang mit Migrationen

Wieder ahnungslos Gegend hier. , Wie würde ich damit umgehen Migrationen der Core Data verwalteten Objekt-Modell? Die einfachste Sache zu tun, hier zu sein scheint, nur um wischen Sie die cloud-Daten speichern, reinigen und laden Sie eine neue Kopie der Daten von einem Gerät, das hat sich die migration, aber das scheint mir etwas riskant, und es kann einen besseren Weg.

Client-Seite


Konvertieren NSManagedObjects in JSON

Konvertieren der Attribute in JSON ist nicht eine sehr schwierige Aufgabe (es gibt jede Menge code für die schwimmende rund um das web). Beziehungen sind das entscheidende problem. In diese stackoverflow-post, Marcus Zarra posten-code in der die Beziehung der Objekte selbst Hinzugefügt werden, um die JSON-Wörterbuch. Jedoch erwähnt er, dass dies eine unendliche Schleife verursachen, abhängig von der Struktur des Modells, und ich bin mir nicht sicher, ob dies funktionieren würde mit meiner Methode, weil ich jedes Objekt als eine einzelne Datei.

Ich habe versucht, einen Weg zu finden, um zu bekommen eine ID als string für eine NSManagedObject. Dann konnte ich retten Beziehungen im JSON-Format als array von IDs. Die nächste Sache, die ich gefunden habe, war [[managedObject objectID] URIRepresentation], aber das ist nicht wirklich eine ID für ein Objekt, seine mehr einen Speicherort für das Objekt in dem persistenten Speicher, und ich weiß nicht, ob es konkret genug ist, um als Referenz für ein Objekt.

Ich glaube, ich könnte erzeugen einer UUID-Zeichenfolge für jedes Objekt und speichern Sie es als ein Attribut, aber ich bin offen für Vorschläge.

Synchronisieren von änderungen an der cloud -

Die erste (und beste) Lösung, tauchte in meinem Kopf war zu hören, für die NSManagedObjectContextObjectsDidChangeNotification um eine Liste der geänderten Objekte, dann update/löschen/einfügen dieser Objekte in der cloud Daten speichern. Nachdem die änderungen gespeichert wurden, die ich brauchen würde, aktualisieren Sie die änderungssatz - Datei für jede andere registrierte Gerät entsprechend neu geänderten Objekte.

Einem problem, das kommt hier oben ist, wie würde ich mit einer fehlgeschlagenen oder unterbrochenen sync?. Eine Idee, die ich habe ist die erste push-änderungen in einem temporären Verzeichnis in der cloud, die dann mal, dass bestätigt wurde, als erfolgreich zu verschmelzen es mit den master-Daten auf der cloud, so dass eine Unterbrechung in der Mitte der sync nicht korrupte Daten. Dann würde ich speichern die Datensätze der Objekte, die aktualisiert werden müssen, die in der cloud in einer plist-Datei oder sowas, um die geschoben werden, während des nächsten mal, wenn die app mit dem internet verbunden ist.

Abrufen geänderten Objekte

Dies ist relativ einfach, das Gerät downloads seine änderungssatz Datei, findet heraus, welche Objekte aktualisiert werden müssen/eingefügt/gelöscht werden, verhält sich dann entsprechend.

Und fasst meine Gedanken der Logik, die dieses system verwenden 🙂 Einsichten, Anregungen, Antworten für Probleme, etc. ist stark geschätzt.

UPDATE

Nach viel denken, Lesen und TechZens Anregungen, ich habe mit einigen Modifikationen in mein Konzept.

Die größte Veränderung, die ich gedacht habe, bis zu machen, ist jedes Gerät ein separate Daten speichern in der cloud. Im wesentlichen, jedes mal, wenn die managed-object-context - spart (Dank TechZen), wird es laden Sie die änderungen an diesem Gerät, die Daten zu speichern. Nach diesen änderungen aktualisiert, es wird ein "changeset" - Datei mit den details ändern, und speichern Sie es in den änderungssatz-Ordner der ANDEREN Geräte, die mit der Anwendung. Wenn die anderen Geräte eine Verbindung zu synchronisieren, gehen Sie durch den änderungssatz-Ordner und wenden Sie jedes changeset, um die lokalen Daten zu speichern, dann aktualisieren Sie Ihre jeweiligen Daten speichert in der cloud als gut.

Nun, wenn ein neues Gerät registriert ist, mit dem account, es finden die neuesten kopieren von Daten auf allen Geräten und herunterladen, die für die Verwendung als Ihrem lokalen Speicher. Dies löst das problem der gleichzeitigen sync und reduziert die Wahrscheinlichkeit für eine Beschädigung der Daten, weil es keine "zentrale" Daten speichern, die einzelnen Geräte berührt nur seine Daten und nur updates, änderungen, anstatt bei jedem Gerät Zugriff auf und ändern die gleichen Daten zur gleichen Zeit.

Gibt es einige offensichtliche Konflikt-Situationen zu bewältigen, vor allem in Bezug auf das löschen von Objekten. Wenn ein changeset herunterladen anweisen, die app zu löschen ein Objekt, das gerade bearbeitet wird, etc. es muss Möglichkeiten zum Umgang mit diesem.

  • Aktualisiert die Frage mit einigen zusätzlichen Ideen, die ich hab gedacht. Input ist willkommen 🙂
  • Dies ist eine wirklich interessante Diskussion. So, drei Monate später, gibt es etwas neues hinzuzufügen? Hast du am Ende die Umsetzung dieser, wie Sie angelegt oder hast unvorhergesehenen Problemen kommen?
InformationsquelleAutor indragie | 2010-07-25
Schreibe einen Kommentar