2015-01-07 17 views
8

Jestem zdezorientowany, jak najlepiej zapisać obiekt zawierający tablicę innych obiektów w CloudKit.Zapisywanie tablicy obiektów w CloudKit

Powiedz, że mam aplikację do listy rzeczy do zrobienia, która ma różne kolekcje przedmiotów. W jaki sposób chciałbym zaoszczędzić/pobrać całą kolekcję przedmiotów?

Czy miałbym typ rekordu kolekcji, który miałby atrybut łańcuchowy o nazwie "nazwa", a następnie atrybut listy referencyjnej o nazwie "przedmioty"?

Wiem, że typ rekordu elementu musi mieć atrybut referencyjny o nazwie "kolekcja", z powodu sposobu, w jaki obiekt CloudKit odwołuje się od obiektu potomnego do obiektu nadrzędnego.

udało mi się zapisać kolekcję bez żadnych wystąpień elementu z następującego kodu

func addCollection(collection: Collection!, completion: (error: NSError!) ->()) { 
    if collection == nil 
     return 
    } 
    let collectionRecord = CKRecord(recordType: "Collection") 
    CollectionRecord.setObject(collection.name, forKey: "Name") 
    privateDB.saveRecord(collectionRecord) { 
     record, error in 
     dispatch_async(dispatch_get_main_queue()) { 
      completion(error: error) 
     } 
    } 
} 

Inną opcją jest podczas zapisywania kolekcji, do pętli wszystkich wystąpień elementu, a także zapisać te indywidualnie, ich Atrybut Odniesienia do Kolekcja nawiązywania połączenia po stronie CloudKit, ale wydaje się, że to zbyt wiele połączeń sieciowych.

Odpowiedz

2

Dla rekordów potrzebujesz CKReference do Collection. Będziesz wtedy mógł ustawić na tym CKReferenceAction. Nie trzeba tworzyć listy CKReference na Collection.

Mając listę obiektów CKReference jest tylko opcja jeśli planujesz używać CKReferenceAction.None co oznaczałoby, że nie istnieje ścisły związek między tymi dwoma recordTypes

Jeśli masz Collection obiekt, a następnie można łatwo zapytanie o typ rekordu Item za pomocą predykatu sprawdzającego, czy CKReference jest wartością parametru Collection.

Zazwyczaj nie ma potrzeby zapisywania wielu rekordów. Po utworzeniu kolekcji z przedmiotami relacja może pozostać niezmieniona. Jeśli chcesz zmienić wiele rekordów, możesz spróbować użyć narzędzia CKModifyRecordsOperation, które obsługuje zapisywanie wielu elementów w jednym działaniu.

Kiedy łącząc istniejące Item recordTypes do Collection, trzeba zrobić, aby zapisać każdy Item ponieważ ma CKReference do Collecion. Zmieniono Item, więc trzeba go zapisać.

+0

W jaki sposób gwarantujesz kolejność przedmiotów w kolekcji? Obawiam się, że podczas pobierania elementów, przybyłyby w innej kolejności niż wtedy, gdy zostały zapisane ... –

+0

Możesz dodać kolejność sortowania w następujący sposób: query.sortDescriptors = [NSSortDescriptor (key: "creationDate", rosnąco: false)] –

+0

Tak, ale muszę zachować kolejność tablic ustawioną przez użytkownika, a nie stosować sortowania za każdym razem, gdy pobierasz tablicę. –