Отличие ошибок 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()
}

И затем, когда он пытается получить несуществующую запись, вот сообщение об ошибке, которое выводится в окне компилятора:

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()
}

person Pierce    schedule 26.04.2016    source источник
comment
Вы должны иметь возможность однозначно определить причину ошибки, проверив ее переменные domain и code. Те же domain и code, та же проблема. И в отличие от localizedDescription, он не изменится между пользователями.   -  person Aaron Brager    schedule 27.04.2016
comment
Таким образом, я должен иметь возможность всегда идентифицировать одну и ту же ошибку, если просто добавлю некоторую логику, например: if error.code == CKErrorCode.UnknownItem? Я проверю это. Спасибо   -  person Pierce    schedule 27.04.2016
comment
Вам следует протестировать код и домен, поскольку объект ошибки может не быть ошибкой CloudKit.   -  person Aaron Brager    schedule 27.04.2016
comment
@AarronBrager Спасибо за быстрый ответ. Я только что обнаружил, что, протестировав код, эта половина работает отлично. Мне нужно было добавить .rawValue в конец, поэтому if error.code == CKErrorCode.UnkownItem.rawValue. Я не совсем уверен, как написать логику для проверки домена. Не могли бы вы опубликовать ответ, чтобы я мог принять его как правильный?   -  person Pierce    schedule 27.04.2016
comment
На самом деле я только что понял, что проверить домен довольно просто. Я опубликую обновление, но если вы хотите отправить ответ, я приму ваш ответ как правильный.   -  person Pierce    schedule 27.04.2016


Ответы (1)


Вы должны иметь возможность однозначно определить причину ошибки, проверив ее переменные domain и code. Те же domain и code, та же проблема. И в отличие от localizedDescription, он не изменится между пользователями.

person Aaron Brager    schedule 27.04.2016