如何使用previousServerchangetoken初始化CKFetchRecordZoneChangesOperation?
我取出由CloudKit服务器记录的变化,但每一次我得到错误如何使用previousServerchangetoken初始化CKFetchRecordZoneChangesOperation?
[LogFacilityCK]得到了操作E0367CA861DAF5A9连接错误: 错误域= NSCocoaErrorDomain代码= 4097“连接服务命名 com.apple .cloudd”的UserInfo = {NSDebugDescription =连接到服务 命名com.apple.cloudd}
我知道原因,因为我错误地初始化CKFetchRecordZoneChangesOperation 请检查下面的代码并纠正我:
CKFetchRecordZoneChangesOperation *operation = [[CKFetchRecordZoneChangesOperation alloc]initWithRecordZoneIDs:@[ recordZoneID ] optionsByRecordZoneID:@{@"Zone":recordZoneID,@"FetchRecordZoneChangesOptions":option}];
我需要这部分帮助:
**@{@"Zone":recordZoneID,@"FetchRecordZoneChangesOptions":option}];**
只需创建变量:
var serverChangeToken: CKServerChangeToken? {
guard let encoded = UserDefaults(suiteName: SharedGroupName)?.data(forKey: ServerChangeTokenKey) else {
return nil
}
return NSKeyedUnarchiver.unarchiveObject(with: encoded) as? CKServerChangeToken
}
然后初始化的对象:
let zone = CKRecordZone(zoneName: "my_custom_zone_name")
let options = CKFetchRecordZoneChangesOptions()
options.previousServerChangeToken = serverChangeToken
let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zone.zoneID], optionsByRecordZoneID: [zone.zoneID: options])
即使使用权CKServerChangeToken,我遇到了这个错误,因为我没有控制数组changedZoneIDs
有0个元素的情况。
严格来说,您需要两个单独的CKServerChangeToken来访问数据库更改和zoneChanges(比如说databaseChangeToken
和zoneChangeToken
)。您可以创建它们作为巴特洛梅耶Semańczyk解释
次使用recordZoneWithIDChangedBlock得到的了zoneid改变区域
次使用fetchDatabaseChangesCompletionBlock的保存databaseChangeToken,并呼吁在您使用zoneChangeToken的CKFetchRecordZoneChangesOperation,
- 每一个区域都有其自己changeToken所以我结束了此解决方案:
let operation = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken)
var changedZoneIDs: [CKRecordZoneID] = []
operation.recordZoneWithIDChangedBlock = { (zoneID) in
changedZoneIDs.append(zoneID)
}
operation.fetchDatabaseChangesCompletionBlock = { (databaseToken, moreComing, error) in
{
//manage moreComing
//save databaseToken
//manage error
if changedZoneIDs.count > 0
{
var optionsByRecordZoneID = [CKRecordZoneID: CKFetchRecordZoneChangesOptions]()
for zoneID in changedZoneIDs {
let changeTokenData = UserDefaults.standard.value(forKey: "\(zoneID.zoneName) zoneChangeToken") as? Data // Read change token from disk
var zoneChangeToken:CKServerChangeToken?
if (changeTokenData != nil){
zoneChangeToken = NSKeyedUnarchiver.unarchiveObject(with: changeTokenData!)as! CKServerChangeToken?
}
let options = CKFetchRecordZoneChangesOptions()
options.previousServerChangeToken = zoneChangeToken
optionsByRecordZoneID[zoneID] = options
}
let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: changedZoneIDs, optionsByRecordZoneID: optionsByRecordZoneID)
// ...
}