查看 CKServerChangeToken 的文档时,您似乎只能在使用 CKFetchRecordChangesOperation 时获得它。请参阅:https ://developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKServerChangeToken_class/index.html
那么现在你怎么能持有那个令牌:
通常你会做这样的事情:如你所见,CKFetchRecordChangesOperation
你可以用previousServerChangeToken
. 这个令牌就像一个时间戳。操作完成后,您会在fetchRecordChangesCompletionBlock
. 您必须将该令牌保存在例如用户默认值中。然后下次启动 aCKFetchRecordChangesOperation
时,您可以使用该令牌开始读取自上次调用它以来的更改。
实际上保存令牌可能有点棘手。我可以建议添加这样的属性:
private var previousChangeToken: CKServerChangeToken? {
get {
let encodedObjectData = NSUserDefaults.standardUserDefaults().objectForKey("\(container.containerIdentifier)_lastFetchNotificationId") as? NSData
var decodedData: CKServerChangeToken? = nil
if encodedObjectData != nil {
decodedData = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObjectData!) as? CKServerChangeToken
}
return decodedData
}
set(newToken) {
if newToken != nil {
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(newToken!), forKey:"\(container.containerIdentifier)_lastFetchNotificationId")
}
}
}
在您的情况下,您希望新应用程序以只能由其他正在运行的应用程序创建的更改令牌开始。因此,除了将更改令牌保存到 NSUserDefaults 之外,您还应该将其保存在公共数据库中的 CloudKit 中的一个特定设置记录类型记录中。新安装的应用程序在其 NSUserDefaults 中没有令牌,然后可以从您的 CloudKit 设置记录中读取令牌。