2016-11-14 2 views
2

Я использую CloudKit и Core Data с Swift для синхронизации моих данных. Поэтому я создал Подписки и после получения уведомления я получаю новые данные из облака для обновления моих основных данных. Это рекомендуемый способ обработки этого обновления. Для извлечения данных я могу вставить CKServerChangeToken для извлечения только нового материала. Мой вопрос заключается в том, как сохранить токен в Core Data для последующих запросов на выборку? Для CKRecords существует метод сохранения только метаданных, но для CKServerChangeToken нет ничего подобного. У кого-нибудь есть идея?Сохранить CKServerChangeToken to Core Data

С наилучшими пожеланиями, Jannik

ответ

10

CKServerChangeToken является непрозрачным объектом данных, который наследует от NSObject и соответствует протоколу NSCopying, что означает, что вы можете использовать NSKeyedArchiver и NSKeyedUnarchiver, чтобы преобразовать маркер к (NS) Данные объект.

A (NS) Объект данных может быть затем сохранен в свойстве любого объекта NSManagedObject. В качестве альтернативы вы можете сохранить эти данные в (NS) UserDefaults. Вот один из способов сделать это как быстрое расширение UserDefaults:

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") 
      } 
     } 
    } 
} 

С помощью этого расширения вы можете получить/установить CKServerChangeToken прямо из (NS) UserDefaults с:

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

Спасибо @richardpiazza. Может ли кто-нибудь подтвердить, что вы действительно должны кэшировать токен изменений дольше, чем запуск приложения, то есть не только в памяти? Документация кажется мне неоднозначной. – vegashacker

+0

@vegashacker Единственная причина, по которой вы не хотите указывать токен изменения в вызове, - принудительное извлечение всех изменений в зоне записи. Взгляните на видеоролик CloudKit Best Practices из WWDC 2016. Вот ссылка на соответствующий временной индекс: https://developer.apple.com/videos/play/wwdc2016-231/?time=822 – richardpiazza

+0

Видео WWDC 2016 " CloudKit Best Practices, в 15'45 ", говорит, что ее нужно кэшировать в разных точках, чтобы вы знали, насколько обновлен кеш данных вашего приложения. См. Https://developer.apple.com/videos/play/wwdc2016/231/ –

Смежные вопросы