Записи, Зона не отображается на панели инструментов и Удалить зону выпуска CloudKit - PullRequest
1 голос
/ 13 апреля 2020

Я создал зону для privateCloudDatabase.

static var privateCloudDatabase: CKDatabase {
    let container = CKContainer(identifier: "iCloud.<bundle>")
    return container.privateCloudDatabase
}

static func createZone() {
    let fetchZonesOperation = CKFetchRecordZonesOperation.fetchAllRecordZonesOperation()
    fetchZonesOperation.fetchRecordZonesCompletionBlock = {
        (recordZones: [CKRecordZone.ID : CKRecordZone]?, error: Error?) -> Void in

        guard error == nil else {
            return
        }


        for recordID in recordZones.keys {
            if recordID.zoneName == zoneName {
                print("Zone Already Created: \(recordID)")
            } else if recordID.zoneName == "_defaultZone" {
                print("Deafult Zone")
            } else {
                let customZone = CKRecordZone(zoneName: zoneName)

                privateCloudDatabase.save(customZone) { zone, error in
                    if let error = error{
                        print("Zone creation error: \(String(describing: error))")
                    } else {
                        print("Zone created: \(String(describing: zone?.zoneID.zoneName))")
                    }
                }
            }
        }
    }
    fetchZonesOperation.qualityOfService = .utility
    privateCloudDatabase.add(fetchZonesOperation)
}

Работает успешно, и я получил сообщение об успехе, но созданный Zone не отображается в CloudKit Dashboard. На данный момент отображается только зона _default.

Другая проблема связана с удалением всех данных из Zone. Для этого я использовал приведенный ниже код

    let fetchZonesOperation = CKFetchRecordZonesOperation.fetchAllRecordZonesOperation()
    fetchZonesOperation.fetchRecordZonesCompletionBlock = {
        (recordZones: [CKRecordZone.ID : CKRecordZone]?, error: Error?) -> Void in

        guard error == nil else {
            return
        }

        guard let recordZones = recordZones else { return }

        let deletionOperation = CKModifyRecordZonesOperation(recordZonesToSave: nil, recordZoneIDsToDelete: recordZones.keys.map { $0 })

        deletionOperation.modifyRecordZonesCompletionBlock = { _, deletedZones, error in
            guard error == nil else {
                let error = error!
                print("Error deleting records.", error)
                return
            }

            print("Records successfully deleted in this zone.")
        }
    }
    fetchZonesOperation.qualityOfService = .userInitiated
    privateCloudDatabase.add(fetchZonesOperation)

Здесь я также не получаю никаких сообщений об успехах и не получаю никаких сообщений об ошибках. Другой метод, который я пытался удалить все данные из зоны:

    let customZone = CKRecordZone(zoneName: zoneName)
    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: recordType, predicate: predicate)
    privateCloudDatabase.perform(query, inZoneWith: customZone.zoneID) { (records, error) in
        if error == nil {
            for record in records! {
                removeRecord(record.recordID.recordName) { record, error in

                }
            }
        }
    }

Здесь я получаю сообщение об успехе, но когда я пытаюсь получить данные из зоны, я получаю все записи, и это говорит о том, что данные не не удаляется с помощью любого из вышеперечисленных методов. Есть предложения по этим запросам?

1 Ответ

0 голосов
/ 15 апреля 2020

Всякий раз, когда я сталкивался с необъяснимыми ошибками и отсутствием обновлений данных в CloudKit, обычно это происходило из-за чего-то глупого:

  1. Опечатка в идентификаторе контейнера, поэтому он взаимодействовал с неправильным база данных в CloudKit.
  2. Учетная запись на моем устройстве Apple, которую я использовал, отличалась от учетной записи, в которую я входил в CloudKit Dashboard.

Вы проверяли журналы CloudKit для подтвердить, что эти действия затрагивают вашу базу данных?

...