CloudKit - recordZoneFetchCompletionBlock 显示 1000 条已删除的记录
CloudKit - recordZoneFetchCompletionBlock shows 1000's of deleted records
我在测试期间注意到了一些奇怪的事情。首先,我在模拟器上Erase All Content and Settings
,然后手动删除CloudKit
中的所有记录。当我第一次 运行 这个应用程序时,我注意到超过 2000 条记录被删除了。我不明白为什么(甚至在哪里!)它们被存储。我完全错过了什么吗?下面是 CloudKit 方法的一部分,它是 运行 作为更新检查的一部分。
operation.fetchDatabaseChangesCompletionBlock = { (token, more, error) in
if error != nil {
finishClosure(UIBackgroundFetchResult.failed)
} else if !zonesIDs.isEmpty {
changeToken = token
let configuration = CKFetchRecordZoneChangesOperation.ZoneConfiguration()
configuration.previousServerChangeToken = changeZoneToken
let fetchOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: zonesIDs, configurationsByRecordZoneID: [zonesIDs[0]: configuration])
fetchOperation.recordChangedBlock = { (record) in
listRecordsUpdated.append(record)
}
fetchOperation.recordWithIDWasDeletedBlock = { (recordID, recordType) in
if changeToken != nil {
listRecordsDeleted[recordID.recordName] = recordType
}
}
fetchOperation.recordZoneChangeTokensUpdatedBlock = { (zoneID, token, data) in
changeZoneToken = token
}
fetchOperation.recordZoneFetchCompletionBlock = { (zoneID, token, data, more, error) in
if error != nil {
print("Error")
} else {
changeZoneToken = token
self.updateLocalRecords(listRecordsUpdated: listRecordsUpdated)
self.deleteLocalRecords(listRecordsDeleted: listRecordsDeleted)
listRecordsUpdated.removeAll()
listRecordsDeleted.removeAll()
}
}
etc.
删除记录
func deleteLocalRecords(listRecordsDeleted: [String : String]) {
for (recordName, recordType) in listRecordsDeleted {
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "\(recordType)")
request.predicate = NSPredicate(format: "ckrecordname = %@", recordName)
do {
let result = try context.fetch(request)
if !result.isEmpty {
if let data = result[0] as? NSManagedObject {
context.delete(data)
}
}
}
catch {
print("Error fetching")
}
}
coreData.saveContext()
}
听起来您正在通过仪表板删除记录,但保留了记录区域。在这种情况下,删除是区域历史的一部分,当您第一次与区域同步时,它基本上会倒带区域的所有历史记录,最后包括所有记录的删除。
请记住,这也适用于区域 - 例如,区域删除会保留在历史记录中,如果您不考虑这一点,可能会导致一些意外情况。我 运行 遇到这样的情况,我在一台设备上删除了区域,但另一台设备随后尝试同步,但找不到区域并重新创建它。
我在测试期间注意到了一些奇怪的事情。首先,我在模拟器上Erase All Content and Settings
,然后手动删除CloudKit
中的所有记录。当我第一次 运行 这个应用程序时,我注意到超过 2000 条记录被删除了。我不明白为什么(甚至在哪里!)它们被存储。我完全错过了什么吗?下面是 CloudKit 方法的一部分,它是 运行 作为更新检查的一部分。
operation.fetchDatabaseChangesCompletionBlock = { (token, more, error) in
if error != nil {
finishClosure(UIBackgroundFetchResult.failed)
} else if !zonesIDs.isEmpty {
changeToken = token
let configuration = CKFetchRecordZoneChangesOperation.ZoneConfiguration()
configuration.previousServerChangeToken = changeZoneToken
let fetchOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: zonesIDs, configurationsByRecordZoneID: [zonesIDs[0]: configuration])
fetchOperation.recordChangedBlock = { (record) in
listRecordsUpdated.append(record)
}
fetchOperation.recordWithIDWasDeletedBlock = { (recordID, recordType) in
if changeToken != nil {
listRecordsDeleted[recordID.recordName] = recordType
}
}
fetchOperation.recordZoneChangeTokensUpdatedBlock = { (zoneID, token, data) in
changeZoneToken = token
}
fetchOperation.recordZoneFetchCompletionBlock = { (zoneID, token, data, more, error) in
if error != nil {
print("Error")
} else {
changeZoneToken = token
self.updateLocalRecords(listRecordsUpdated: listRecordsUpdated)
self.deleteLocalRecords(listRecordsDeleted: listRecordsDeleted)
listRecordsUpdated.removeAll()
listRecordsDeleted.removeAll()
}
}
etc.
删除记录
func deleteLocalRecords(listRecordsDeleted: [String : String]) {
for (recordName, recordType) in listRecordsDeleted {
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "\(recordType)")
request.predicate = NSPredicate(format: "ckrecordname = %@", recordName)
do {
let result = try context.fetch(request)
if !result.isEmpty {
if let data = result[0] as? NSManagedObject {
context.delete(data)
}
}
}
catch {
print("Error fetching")
}
}
coreData.saveContext()
}
听起来您正在通过仪表板删除记录,但保留了记录区域。在这种情况下,删除是区域历史的一部分,当您第一次与区域同步时,它基本上会倒带区域的所有历史记录,最后包括所有记录的删除。
请记住,这也适用于区域 - 例如,区域删除会保留在历史记录中,如果您不考虑这一点,可能会导致一些意外情况。我 运行 遇到这样的情况,我在一台设备上删除了区域,但另一台设备随后尝试同步,但找不到区域并重新创建它。