CloudKit Ошибка дифференциации
Мне нужна помощь, чтобы научиться правильно обрабатывать ошибки при извлечении записей через CloudKit
, В настоящее время у меня есть приложение, которое сохраняет многочисленные записи в облаке и загружает их при запуске. Я ссылаюсь на записи, используя CKReference
и каждый раз, когда я сохраняю ссылку, я использую CKReferenceAction.DeleteSelf
вариант. Проблема, с которой я периодически сталкивался, заключается в том, что при удалении ссылочной записи иногда может пройти значительное время, прежде чем ссылка удалит себя. Из-за этого я иногда сталкивался с ситуацией, когда мое приложение получало CKReference
для записи, которая больше не существует. Я могу вручную узнать, когда это происходит, просто вставив print(error!)
в моем обработчике ошибок. Что я хотел бы знать, так это то, как я могу добавить некоторый код для обнаружения этой конкретной ошибки, т.е. if error.localizedDescription == ??? {
, Вот основной код, который я использую для получения:
let fetch = CKFetchRecordsOperation(recordIDs: recordIDs)
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in
if error != nil {
// Error Line A (See below)
print("ERROR! : \(error!.localizedDescription)")
// Error Line B (See below)
print("ERROR: \(error!)")
}
else if let record = record {
// Record was found
}
}
if let database = self.privateDatabase {
fetch.database = database
fetch.start()
}
И затем, когда он пытается извлечь несуществующую запись, вот сообщение об ошибке, которое выводится в окне компилятора:
а) ERROR! : Error fetching record <CKRecordID: 0x10025b290; dbbda7c3-adcc-4271-848f-6702160ea34f:(_defaultZone:__defaultOwner__)> from server: Record not found
б) ERROR: <CKError 0x125e82820: "Unknown Item" (11/2003); server message = "Record not found"; uuid = (removed); container ID = "(removed)">
Выше в строке ошибки B, где написано CKError 0x125e82820:
Могу ли я использовать это для создания оператора if для проверки этого конкретного типа ошибки? Я действительно мог бы использовать любую помощь, чтобы найти способ правильно решить эту проблему, когда это произойдет. Я настроил некоторую структуру загрузки для своего приложения, и когда он думает, что есть запись, которую он должен найти, но не может, это портит мой процесс загрузки. Я был бы очень признателен за любую помощь, которую я могу получить, я предполагаю, что это простое решение, но, видимо, не то, которое мне удалось найти. Спасибо!
ОБНОВИТЬ -
Благодаря @AaronBrager я смог найти правильное решение. Вы можете проверить код ошибки, чтобы сопоставить его с любой конкретной ошибкой, и домен, чтобы убедиться, что это CKError
, Вот решение, которое работает для меня:
let fetch = CKFetchRecordsOperation(recordIDs: recordIDs)
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in
if error != nil {
if error!.code == CKErrorCode.UnknownItem.rawValue && error!.domain == CKErrorDomain {
// This works great!
}
}
else if let record = record {
// Record was found
}
}
if let database = self.publicDatabase {
fetch.database = database
fetch.start()
}
1 ответ
Вы должны быть в состоянии однозначно определить причину ошибки, проверив ее domain
а также code
переменные. Так же domain
а также code
, та же проблема. И в отличие от localizedDescription
, это не изменится между пользователями.