5 votes

Différenciation des erreurs CloudKit

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

2voto

Aaron Brager Points 16394

Vous devriez être en mesure d'identifier de manière unique la cause d'une erreur en inspectant son domain y code variables. Même domain y code même problème. Et contrairement à localizedDescription il ne changera pas d'un utilisateur à l'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X