Мне нужна помощь, чтобы научиться правильно обрабатывать ошибки при получении записей через 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()
}
И затем, когда он пытается получить несуществующую запись, вот сообщение об ошибке, которое выводится в окне компилятора:
a) ERROR! : Error fetching record <CKRecordID: 0x10025b290; dbbda7c3-adcc-4271-848f-6702160ea34f:(_defaultZone:__defaultOwner__)> from server: Record not found
b) 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()
}
domain
иcode
. Те жеdomain
иcode
, та же проблема. И в отличие отlocalizedDescription
, он не изменится между пользователями. - person Aaron Brager   schedule 27.04.2016if error.code == CKErrorCode.UnknownItem
? Я проверю это. Спасибо - person Pierce   schedule 27.04.2016.rawValue
в конец, поэтомуif error.code == CKErrorCode.UnkownItem.rawValue
. Я не совсем уверен, как написать логику для проверки домена. Не могли бы вы опубликовать ответ, чтобы я мог принять его как правильный? - person Pierce   schedule 27.04.2016