8
votes

NsObjectorCESPESSIBLEExceptionException ', raison:' Coredata n'a pas pu remplir une faute

Mon application iOS utilise des données de base via plusieurs threads. Je reçois des rapports d'accident avec le message suivant: "" NsObjecteCessibleException ', raison: "Coredata n'a pas pu remplir une faute pour" 0x1e07a9b0 "

Je comprends ce qui cause ce problème - que l'objet a été supprimé mais que l'objet a été supprimé, mais un autre thread est Essayer d'y accéder. Je travaille pour résoudre le problème, mais je veux ajouter un chèque dans le fil d'arrière-plan pour voir si l'objet défaut de cette manière.

Mon code en ce moment concerne myObject.myvalue . Est-il possible de faire une vérification, telle que: xxx

... de sorte qu'il sortira de la méthode avant de faire quoi que ce soit Cela pourrait causer un tel accident? Ou appellerai simplement myObject.myvalue , même pour voir s'il est null, car une telle exception doit être lancée?


1 commentaires

Au fait, vous avez une acceptation de réponse extrêmement faible qui est probablement pourquoi personne ne veut répondre à vos questions. Veuillez envisager d'examiner vos anciennes questions et de sélectionner la bonne réponse pour chacun. Stackoverflow.com/users/353137/jason?tab=questions


5 Réponses :


19
votes

Vous pouvez essayer d'utiliser existanteObjectwithid: erreur: code> :

retourne l'objet pour l'ID spécifié. P>

if ([myMOC existingObjectWithID:myObject.objectID error:&error])
    ...


0 commentaires

5
votes

Vous devez vérifier que l'objet existe avant d'accéder à ses variables si vous avez des problèmes dans lesquels l'objet peut être supprimé sur un autre thread.

Deux méthodes: P>

  1. Actualisez la vue Datasourcents Chaque fois que vos données sont supprimées. Vous pouvez le faire en vous inscrivant à la notification nsmaniedObjectContExtOstObjectsDidCoupNotification code>, puis à l'analyse du userinfo code> sur cette notification pour voir quel objet a été supprimé. LI>
  2. Utilisez le code similaire à ci-dessous lorsque vous passez des données sur plusieurs threads. LI> ol>

    Exemple: P>

    // Cache and pass the object's ID off to another thread to do work on
    // You can just store it as a property on the class
    @try {
        NSManagedObject *theObject = [managedObjectContext objectWithID:self.theObjectID];
    
        // do stuff with object
    }
    @catch (NSException * e) {
        // An entity with that object ID could not be found (maybe they were deleted)
        NSLog(@"Error finding object: %@: %@", [e name], [e reason]);
    }
    


1 commentaires

Méthode n ° 1, définitivement. Je peux attendre les notifications sur mon point de vue "détail" (accessible avant / pendant une synchronisation) et désactiver toutes les fonctionnalités qui interagissent avec l'objet, avertir l'utilisateur, etc.



0
votes

Vous pouvez vérifier [myObject isfault] myObject est un nsmanagedObject instance


1 commentaires

Le fait qu'un objet soit une faute seule ne signifie pas que l'accès à aucune de ses propriétés jettera cette exception. Habituellement, cela entraînera le chargement des données à partir du magasin de données. L'exception n'est lancée que si cet objet n'existe plus dans le magasin de données et ne peut donc pas être chargé (A.K.A. "Défaut").



3
votes

Vous pouvez vérifier que NsmaniedContext existe lorsque vous utilisez NsManagedObject. comme ceci: xxx


1 commentaires

J'avais la même pensée, mais je ne trouve aucune documentation confirmant ce comportement. Quelqu'un peut-il confirmer que c'est un moyen définitif de vérifier si l'objet est toujours disponible?



0
votes

Vous pouvez essayer d'utiliser:

DevraityeteteIncessibleFault

propriété sur le contexte de l'objet géré. Comme cet article dit qu'il devrait modifier le comportement de la défaillance de l'objet déjà supprimé.

https://cocoacasts.com/what-are-core- Data-Query-Generations /

EDIT: Depuis iOS 9 (quand il a été ajouté), la valeur par défaut de la propriété est oui.


0 commentaires