我在测试过程中发现了一些奇怪的东西。首先,我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()
}
答案 0 :(得分:0)
听起来您正在通过仪表板删除记录,但是保留了记录区域。在这种情况下,删除是区域历史记录的一部分,当您首次与区域同步时,它基本上会回滚该区域的所有历史记录,最后包括所有记录的删除。
请记住,这也适用于区域-因此,例如,区域删除会保留在历史记录中,如果不考虑这一点,可能会导致某些不良情况。我遇到了这样的情况:我要在一台设备上删除区域,但是另一台设备随后将尝试同步,没有找到区域,然后再次创建它。