2016-11-14 21 views
2

私はCloudKitとCore DataをSwiftと共に使用してデータを同期します。したがって、私はサブスクリプションを作成し、通知を受け取った後、クラウドから新しいデータをフェッチして、コアデータを更新します。これは、このアップデートを処理するための推奨される方法です。データの変更をフェッチするために、私はCKServerChangeTokenを挿入して新しいものだけをフェッチすることができます。私の質問は、後でリクエストを取得するためにコアデータにトークンを保存する方法です。 CKRコードの場合、メタデータのみを保存する方法がありますが、CKServerChangeTokenの場合はこのようなものはありません。誰にもアイデアはありますか?CKServerChangeTokenをコアデータに保存

よろしく、Jannik

答えて

10

CKServerChangeTokenはNSObjectのを継承します(NS)データにトークンを変換するNSKeyedArchiverとNSKeyedUnarchiverを使用できることを意味NSCopyingプロトコルに準拠した不透明なデータオブジェクトでありますオブジェクト。

データオブジェクトは、任意のNSManagedObjectのプロパティに格納できます。あるいは、このデータを(NS)UserDefaultsに保存することもできます。ここでUserDefaultsへの迅速な拡張として、これを達成するために一つの方法です:CKServerChangeToken右から設定あなたが得ることができる。この拡張/で

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

と(NS)UserDefaults:

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

ありがとう@richardpiazzaは。あなたは、実際には、メモリの変更だけでなく、アプリケーションの実行よりも長く変更トークンをキャッシュすることになっていることを誰でも確認できますか?ドキュメンテーションは私にあいまいです。 – vegashacker

+0

@vegashacker呼び出しで変更トークンを指定したくない唯一の理由は、レコードゾーンのすべての変更を強制的に取得することです。 WWDC 2016のCloudKit Best Practicesビデオをご覧ください。関連するタイムインデックスへのリンクは次のとおりです。https://developer.apple.com/videos/play/wwdc2016-231/?time=822 – richardpiazza

+0

WWDC 2016ビデオ " CloudKitのベストプラクティス(15'45 ")では、アプリのデータキャッシュが最新の状態になっているかどうかを正確に把握できるように、キャッシュを実行する必要があります。 https://developer.apple.com/videos/play/wwdc2016/231/をご覧ください。 –

関連する問題