2015-02-27 6 views
9

Attualmente sto progettando una soluzione di sincronizzazione basata su CloudKit e mi sono chiesto quale sia il modo migliore per mantenere coerente l'ordine di un elenco (un array nel mio caso) di elementi cloud (oggetti CKRecord) .Mantieni ordine di NSArray con CloudKit

Apple sconsiglia di conservare un riferimento a oggetti figlio e fa semplicemente riferimento all'oggetto padre con un CKReference dal figlio. Funziona bene se vuoi interrogare i tuoi articoli sulla base di una delle sue proprietà (ad esempio una data di creazione), ma non se hai un ordine che è determinato dall'utente.

Sono arrivato a due approcci diversi basati sulla stessa idea: mantenere un manifest di identificatori per gestire la posizione dell'oggetto.

1) Sincronizzare un record aggiuntivo (noto anche come manifest) con una matrice di identificativi, ognuno dei quali identifica un oggetto CKRecord (e l'oggetto modello locale corrispondente).

2) Creare un oggetto padre che contiene una matrice di riferimenti (oggetti CKReference) agli oggetti figlio di esso. Questo array mantiene l'ordine dato.

Ritengo che questa non sia la migliore soluzione possibile a questo problema e sarei lieto di sapere cosa ne pensate.

+0

Aggiungi un campo 'indice' al bambino? – Paulw11

+0

Ciò richiederebbe ** sempre ** aggiornare tutti i child quando si esegue un'operazione di lista (come aggiungere o eliminare un elemento). – JanApotheker

+0

@JanApotheker, non proprio. 'NSArray' mantiene il suo ordine anche se si inserisce un nuovo oggetto tra altri oggetti usando' indexes'. –

risposta

8

Apple si sconsiglia di mantenere un riferimento agli oggetti figlio, ma ciò non significa che non si possa semplicemente includere un array con ID di record nel proprio oggetto. Questi non devono essere oggetti CKReference. Potresti semplicemente salvare una serie di valori stringa.

Penso che tu abbia ragione che questo sarebbe l'approccio migliore/più semplice per mantenere un ordinamento.

Un'altra soluzione potrebbe essere quella di creare un elenco collegato. Ogni record richiede quindi un riferimento al record successivo. Quando si modifica l'ordine, è sufficiente modificare 3 record. 1 il record che ha fatto riferimento al tuo record, il nuovo record che punterà al tuo record e al record stesso.

+0

Grazie per la tua risposta. Ho ragione nel suggerire di memorizzare una matrice di identificatori (stringa) nell'oggetto padre? – JanApotheker

+1

Questa sarebbe la cosa più semplice da mantenere. Quindi gli oggetti figli avranno ancora un riferimento al suo oggetto padre. L'array di ID nell'oggetto padre viene quindi utilizzato solo per l'ordinamento manuale. –