2015-02-27 8 views
9

Ich entwickle gerade eine CloudKit basierte Synchronisierungslösung und ich fragte mich, was der beste Weg ist, die Reihenfolge einer Liste (ein Array in meinem Fall) von Cloud-Objekten (CKRecord Objekte) konsistent zu halten .Keep order of NSArray mit CloudKit

Apple rät davon ab, einen Verweis auf untergeordnete Objekte zu halten, und verweisen stattdessen einfach auf das übergeordnete Objekt mit einem CKReference vom untergeordneten Objekt. Dies funktioniert gut, wenn Sie Ihre Artikel basierend auf einer ihrer Eigenschaften abfragen möchten (z. B. ein Erstellungsdatum), aber nicht, wenn Sie eine Bestellung haben, die vom Benutzer bestimmt wird.

Ich habe zwei verschiedene Ansätze entwickelt, die auf der gleichen Idee basieren: Verwalte ein Manifest von Bezeichnern, um die Position des Gegenstands zu verwalten.

1) Synchronisieren Sie einen zusätzlichen Datensatz (auch als Manifest bezeichnet), der über ein Array von Bezeichnern verfügt, die jeweils ein CKRecord-Objekt (und das entsprechende lokale Modellobjekt) identifizieren.

2) Erstellen Sie ein übergeordnetes Objekt, das ein Array von Referenzen (CKReference Objekte) zu seinen untergeordneten Objekten enthält. Dieses Array behält die angegebene Reihenfolge bei.

Ich fühle, dass dies nicht die bestmögliche Lösung für dieses Problem ist und ich würde mich freuen zu hören, was Sie denken.

+0

Fügen Sie dem Kind ein 'Index'-Feld hinzu? – Paulw11

+0

Dies würde erfordern ** immer ** alle Kinder aktualisieren, wenn Sie einen Listenvorgang ausführen (wie Hinzufügen oder Löschen eines Elements). – JanApotheker

+0

@JanApotheker, nicht wirklich. 'NSArray' behält seine Reihenfolge bei, auch wenn Sie ein neues Objekt zwischen anderen Objekten einfügen, indem Sie' indexes' verwenden. –

Antwort

8

Apple rät davon ab, einen Verweis auf untergeordnete Objekte zu halten, aber das bedeutet nicht, dass Sie nicht einfach ein Array mit Datensatz-IDs in Ihr Objekt einschließen können. Diese müssen keine CKReference-Objekte sein. Sie könnten einfach ein Array von String-Werten speichern.

Ich denke, Sie haben Recht, dass dies der beste/einfachste Ansatz für die Aufrechterhaltung einer Sortierreihenfolge wäre.

Eine andere Lösung wäre, eine verknüpfte Liste zu erstellen. Jeder Datensatz benötigt dann einen Verweis auf den nächsten Datensatz. Wenn Sie die Reihenfolge ändern, müssen Sie nur 3 Datensätze ändern. 1 der Datensatz, der auf Ihren Datensatz verweist, der neue Datensatz, der auf Ihren Datensatz und den Datensatz selbst verweist.

+0

Danke für deine Antwort. Habe ich Recht, dass Sie vorschlagen, ein Array von (String-) Bezeichnern im übergeordneten Objekt zu speichern? – JanApotheker

+1

Das wäre am einfachsten zu pflegen. Dann würden Ihre untergeordneten Objekte immer noch einen Verweis auf das übergeordnete Objekt haben. Das Array der IDs im übergeordneten Objekt wird nur für die manuelle Sortierreihenfolge verwendet. –