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()
}

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

请记住,这也适用于区域 - 例如,区域删除会保留在历史记录中,如果您不考虑这一点,可能会导致一些意外情况。我 运行 遇到这样的情况,我在一台设备上删除了区域,但另一台设备随后尝试同步,但找不到区域并重新创建它。