CloudKit - recordZoneFetchCompletionBlock показывает 1000 удаленных записей - PullRequest
0 голосов
/ 01 мая 2019

Я заметил что-то странное во время тестирования. Сначала я 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 голосов
/ 02 мая 2019

Похоже, вы удаляете записи через панель инструментов, но сохраняете зону записи.В этом случае удаления являются частью истории зоны, и при первой синхронизации с зоной она в основном перематывает всю эту историю для зоны, которая в конце включает удаление для всех ваших записей.

Имейте в виду, что это также относится к зонам, поэтому удаление зоны, например, остается в истории и может привести к нежелательным ситуациям, если вы не учтете это.Я столкнулся с ситуацией, когда удалял зону на одном устройстве, но затем другой пытался синхронизироваться, не находил зоны и снова ее создавал.

...