Обработка ошибок Cloudkit для сетевых сбоев

У меня есть реализация Cloudkit, как показано ниже.

let zoneID = CKRecordZoneID(zoneName: "TextZone", ownerName: CKCurrentUserDefaultName)
let options = CKFetchRecordZoneChangesOptions()

if let data = USERDEFAULTS.value(forKey: "cloudToken") as? Data {
    let serverChangeToken = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as! CKServerChangeToken
    options.previousServerChangeToken = serverChangeToken
}

let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zoneID], optionsByRecordZoneID: [zoneID:options])
operation.fetchAllChanges = true

var deletedRecords = [CKRecordID]()
var changedRecords = [CKRecord]()

operation.recordZoneFetchCompletionBlock = {
    zoneID, serverChangeToken, data, flag, error in

    print("RecordFetch: ", changedRecords.count, deletedRecords.count)

    if error == nil {
        if let serverChangeToken = serverChangeToken {
            USERDEFAULTS.set(NSKeyedArchiver.archivedData(withRootObject: serverChangeToken), forKey: "cloudToken")
        }

        if changedRecords.count == 0, deletedRecords.count == 0 {
            completion(false,CKError.isRecordNotFound as? Error)
        } else {
            completion(true,nil)
        }

    } else {
        guard let ckerror = error as? CKError else {
            completion(false,error)
            return
        }

        guard ckerror.isZoneNotFound() else {
            completion(false,error)
            return
        }

        CloudkitManager.createZone(zoneType: "TextZone") { error in
            guard error == nil else {
                completion(false,error)
                return
            }
            // Some other code
        }

        guard ckerror.isRecordNotFound() else {
            completion(false,error)
            return
        }

        guard ckerror.isUnknownItem() else {
            completion(false,error)
            return
        }

        guard ckerror.determineRetry(error: error!) else {
            completion(false,error)
            return
        }

        guard ckerror.isBatchRequestFailed() else {
            completion(false,error)
            return
        }

        guard ckerror.isPartialFailure() else {
            completion(false,error)
            return
        }

        // Some other code

        guard ckerror.isLimitExceeded() else {
            completion(false,error)
            return
        }
    }
}

operation.recordChangedBlock = {
    changedRecord in

    changedRecords.append(changedRecord)

    // DB Update for the changedRecord
}

operation.recordWithIDWasDeletedBlock = {
    (recordId, strValue) in
    deletedRecords.append(recordId)

    // DB Update for the changedRecord
}

CloudkitManager.cloudDatabase.add(operation)

Я тестирую некоторые ошибки, чтобы проверить, как этот код ведет себя для диапазона ошибок, предоставленных Apple. Однако я не получил никакого обратного вызова, когда я выключил Интернет на устройстве.

Операция продолжается, как если бы я отключил Интернет на 4-й записи, операция будет продолжать извлекать 4-ю запись до тех пор, пока она не будет успешно найдена (включив Интернет), тогда только она продолжится.

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

Пожалуйста, дайте мне знать, если мой код исправлен и как проверить другие перечисленные ошибки.

0 ответов

Другие вопросы по тегам