Comment rendre NSManagedObject pas faute?

Je suis en train de déboguer un gros projet écrit par un autre développeur. Le projet utilise CoreData dont je suis très nouveau. J'ai un crash qui se produit en raison du fait que NSManagedObject est un défaut (j'ai une mauvaise compréhension de ce qu'est la faute) et je voudrais convertir l'object en "pas faute" et voir si cela aide. La lecture de la documentation m'a fait penser que to make object not fault égal à to fire fault (encore une fois j'ai une mauvaise compréhension de ce qu'est "tirer"), j'ai donc décidé de le triggersr en appelant n'importe quelle méthode hasChanges puisque ce n'est pas dans la list des methods qui ne génèrent pas de faute. Cependant, même après avoir appelé cette méthode, l'object restait toujours en défaut. Quelqu'un peut-il me donner un exemple de la façon de convertir NSManagedObject en état "sans faute"?

L'exception que vous avez mentionnée dans un commentaire est:

 Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x1f0627a0 <x-coredata://E40418A0-A8E5-4340-865F-A9DA2E0095DD/CoreObject/p288>'' 

Le message "ne peut pas remplir une faute" indique qu'il ne s'agit pas simplement d'un problème de triggersment de la panne. En fait, il n'y a pas d'étapes spéciales pour triggersr une panne – vous accédez simplement aux attributes, et si nécessaire, la panne se triggers automatiquement.

Ce que cette erreur vous dit, c'est que vous faites quelque chose qui provoque une erreur, mais que Core Data ne trouve aucun logging de l'instance que vous utilisez. Cela peut arriver dans certains scénarios, par exemple:

  1. Récupère un object et le laisse comme un défaut (c.-à-d. N'accède à aucun atsortingbut)
  2. Supprimez-le des données de base, mais gardez une reference à l'object (peut-être dans une variable d'instance)
  3. Sauvegarder les modifications
  4. Essayez d'accéder à un atsortingbut sur l'object que vous avez récupéré à l'étape 1.

À ce stade, datatables de base utilisent normalement l'object pour searchr la valeur de l'atsortingbut. Mais vous l'avez déjà supprimé, donc datatables d'atsortingbut ont disparu. Core Data renvoie cette exception.

D'autres scénarios peuvent triggersr this– appel à la reset sur un context d'object géré tout en conservant les objects précédemment récupérés ou en supprimant le stockage persistant (de sorte que datatables existent toujours dans le file de stockage, mais le file n'est plus chargé ). En général, cela signifie que datatables de base essaient de searchr des données sur un object qui n'est plus valide.

Qu'as tu besoin de faire:

  • Déterminez quel object est à l'origine de cela. Définir un point d'arrêt d'exception, de sorte que le débogueur se charge tout comme le crash se produit, est probablement une bonne idée.
  • Débarrassez-vous de cet object . Empêcher la panne de triggersr pourrait empêcher ce crash spécifique, mais tant que vous avez toujours cet object, c'est comme une mine terrestre dans votre application. Il va exploser et planter l'application dès que vous le touchez.
  • Découvrez pourquoi vous avez des objects gérés invalides qui se cachent dans la memory. Peut-être que vous auriez dû vous en débarrasser plus tôt? Peut-être que vous supprimez accidentellement quelque chose que vous ne voulez pas supprimer? Pour une raison quelconque, vous gardez les objects gérés lorsqu'ils ne sont plus valides. C'est le problème principal qui cause votre problème.

Faulting est le process par lequel un object et / ou ses propriétés sont extraits de la database à la request.

Par exemple, si vous tentez d'accéder à une propriété ou à une relation sur un object, person.name , cet object n'a peut-être pas ses données en memory et il doit être extrait du magasin de données sous-jacent. C'est une faute.

La faille est une partie normale du fonctionnement des données de base et ne devrait pas être liée à des plantages. Un object ne sera pas utilisé lorsque vous essaierez d'accéder à ses propriétés et relations.