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. P>
Mon code en ce moment concerne ... 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 code>. Est-il possible de faire une vérification, telle que: p>
myObject.myvalue code>, même pour voir s'il est null, car une telle exception doit être lancée? P> P>
5 Réponses :
Vous pouvez essayer d'utiliser existanteObjectwithid: erreur: code>
:
retourne l'objet pour l'ID spécifié. P>
if ([myMOC existingObjectWithID:myObject.objectID error:&error]) ...
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>
nsmaniedObjectContExtOstObjectsDidCoupNotification code>, puis à l'analyse du userinfo code> sur cette notification pour voir quel objet a été supprimé. LI>
- 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]);
}
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.
Vous pouvez vérifier [myObject isfault] code> où
myObject code> est un
nsmanagedObject code> instance p>
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").
Vous pouvez vérifier que NsmaniedContext existe lorsque vous utilisez NsManagedObject.
comme ceci:
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?
Vous pouvez essayer d'utiliser: p>
DevraityeteteIncessibleFault P> blockQuote>
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é. P>
https://cocoacasts.com/what-are-core- Data-Query-Generations / P>
EDIT: Depuis iOS 9 (quand il a été ajouté), la valeur par défaut de la propriété est oui. P>
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