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, это не изменится между пользователями.

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