Обработка ошибок 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-ю запись до тех пор, пока она не будет успешно найдена (включив Интернет), тогда только она продолжится.
В идеале, я полагаю, что это должно послать мне какую-то ошибку сбоев сети, чтобы я мог попробовать через некоторое время.
Пожалуйста, дайте мне знать, если мой код исправлен и как проверить другие перечисленные ошибки.