CloudKit-recordZoneFetchCompletionBlock显示1000条已删除的记录

时间:2019-05-01 16:32:33

标签: sql-delete cloudkit

我在测试过程中发现了一些奇怪的东西。首先,我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()
}

1 个答案:

答案 0 :(得分:0)

听起来您正在通过仪表板删除记录,但是保留了记录区域。在这种情况下,删除是区域历史记录的一部分,当您首次与区域同步时,它基本上会回滚该区域的所有历史记录,最后包括所有记录的删除。

请记住,这也适用于区域-因此,例如,区域删除会保留在历史记录中,如果不考虑这一点,可能会导致某些不良情况。我遇到了这样的情况:我要在一台设备上删除区域,但是另一台设备随后将尝试同步,没有找到区域,然后再次创建它。