2016-11-14 3 views
2

Ich verwende CloudKit und Core Data mit Swift, um meine Daten zu synchronisieren. Deshalb habe ich Subskriptionen erstellt und nachdem ich eine Benachrichtigung erhalten habe, hole ich die neuen Daten aus der Cloud, um meine Core Data zu aktualisieren. Dies ist die empfohlene Vorgehensweise für dieses Update. Zum Abrufen von Datenänderungen kann ich ein CKServerChangeToken einfügen, um nur die neuen Daten abzurufen. Meine Frage ist, wie man das Token für spätere Abrufanforderungen in Core Data speichert. Für CKRecords gibt es eine Methode, um nur die Metadaten zu speichern, aber für CKServerChangeToken gibt es so etwas nicht. Hat jemand eine Idee?Speichern von CKServerChangeToken in Core-Daten

Mit freundlichen Grüßen, Jannik

Antwort

10

Die CKServerChangeToken sind ein undurchsichtiges Datenobjekt, das von NSObject erbt und entspricht das NSCopying Protokoll, was bedeutet, dass Sie eine NSKeyedArchiver und NSKeyedUnarchiver verwenden können, das Token an ein (NS) Daten zu konvertieren Objekt.

Ein (NS) Datenobjekt kann dann in einer Eigenschaft eines beliebigen NSManagedObject gespeichert werden. Alternativ könnten Sie diese Daten in den (NS) UserDefaults speichern. Hier ist ein Weg, dies als eine rasche Erweiterung UserDefaults zu erreichen:

import Foundation 
import CloudKit 

public extension UserDefaults { 

    public var serverChangeToken: CKServerChangeToken? { 
     get { 
      guard let data = self.value(forKey: "ChangeToken") as? Data else { 
       return nil 
      } 

      guard let token = NSKeyedUnarchiver.unarchiveObject(with: data) as? CKServerChangeToken else { 
       return nil 
      } 

      return token 
     } 
     set { 
      if let token = newValue { 
       let data = NSKeyedArchiver.archivedData(withRootObject: token) 
       self.set(data, forKey: "ChangeToken") 
      } else { 
       self.removeObject(forKey: "ChangeToken") 
      } 
     } 
    } 
} 

Mit dieser Erweiterung können Sie erhalten/set des CKServerChangeToken rechts aus (NS) UserDefaults mit:

let changeToken = UserDefaults.standard.serverChangeToken 
UserDefaults.standard.serverChangeToken = `newToken` 
+0

Dank @richardpiazza. Kann jemand bestätigen, dass Sie das Änderungstoken tatsächlich länger als den Lauf der App zwischenspeichern sollten - also nicht nur im Speicher? Die Dokumentation scheint mir zweideutig. – vegashacker

+0

@vegashacker Der einzige Grund, warum Sie das Änderungstoken in dem Aufruf nicht bereitstellen möchten, besteht darin, das Abrufen aller Änderungen in der Aufzeichnungszone zu erzwingen. Sehen Sie sich das CloudKit Best Practices-Video von der WWDC 2016 an. Hier finden Sie einen Link zum relevanten Zeitindex: https://developer.apple.com/videos/play/wwdc2016-231/?time=822 – richardpiazza

+0

Das WWDC 2016 Video " CloudKit Best Practices (15'45 '') sagt, dass es über mehrere Runs hinweg genau zwischengespeichert werden muss, damit Sie wissen, wie aktuell der Datencache Ihrer App ist. Siehe https://developer.apple.com/videos/play/wwdc2016/231/ –