J'ai besoin d'aide pour apprendre à gérer correctement les erreurs lors de la récupération d'enregistrements par l'intermédiaire de l'application CloudKit
. Actuellement, j'ai une application qui sauvegarde de nombreux enregistrements dans le nuage et les charge au lancement. J'ai référencé les enregistrements en utilisant un CKReference
et à chaque fois que j'enregistre la référence, j'utilise l'option CKReferenceAction.DeleteSelf
option. Un problème que j'ai rencontré périodiquement est que lorsqu'un enregistrement référencé est supprimé, il peut parfois s'écouler un temps considérable avant que la référence ne soit elle-même supprimée. Cela m'a amené à rencontrer occasionnellement la situation suivante : mon application a récupéré un enregistrement CKReference
pour un enregistrement qui n'existe plus. Je suis capable de trouver manuellement quand cela se produit en insérant simplement print(error!)
dans mon gestionnaire d'erreurs. Ce que je voudrais savoir, c'est comment ajouter du code pour détecter cette erreur spécifique. if error.localizedDescription == ??? {
. Voici le code de base que j'utilise pour la récupération :
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()
}
Et lorsqu'il essaie de récupérer l'enregistrement inexistant, voici le message d'erreur qui s'affiche dans la fenêtre du compilateur :
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)">
Au-dessus de la ligne d'erreur B, où il est dit CKError 0x125e82820:
Puis-je l'utiliser pour créer une instruction if afin de vérifier ce type d'erreur spécifique ? J'aurais vraiment besoin d'aide pour trouver un moyen de résoudre ce problème correctement lorsqu'il se produit. J'ai mis en place une certaine structure de chargement pour mon application, et lorsqu'elle pense qu'il y a un enregistrement qu'elle doit trouver, mais qu'elle ne peut pas le faire, cela perturbe mon processus de chargement. J'apprécierais vraiment toute aide que je pourrais obtenir, je suppose que c'est une solution facile, mais apparemment pas une que j'ai été en mesure de trouver. Merci.
MISE À JOUR -
Grâce à @AaronBrager, j'ai pu trouver la bonne solution. Vous pouvez vérifier le code d'erreur pour qu'il corresponde à une erreur spécifique, et le domaine pour vous assurer qu'il s'agit d'une CKError
. Voici la solution qui fonctionne pour moi :
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()
}