1

J'ai 2 contextes NSManagedObject, un temporaire et un autre primaire. Le contexte temporaire a son contexte parent défini sur le contexte principal. Je les utilise tous les deux dans les cas suivants:NSManagedObjectContext Enfant/Parent - L'enfant ne supprime pas les registeredObjects

  • Lorsque je crée un "nouvel" objet, j'en crée un nouveau avec le contexte temporaire. Si l'utilisateur clique sur "annuler" et décide de ne pas créer le nouvel objet, je supprime simplement l'objet du contexte de l'objet géré et enregistre ce contexte.
  • Si l'utilisateur enregistre ce nouvel objet, j'enregistre le contexte temporaire, puis enregistrez le contexte principal pour conserver ces modifications. J'utilise les méthodes "performBlock" et enchaîne les sauvegardes, comme recommandé par Apple et les autres posts de Stackoverflow.
  • Si je modifie un objet existant, je le conserve dans le contexte principal lors des modifications. Si l'utilisateur clique sur "annuler", j'appelle "rollback" sur le contexte primaire, ce qui supprime tous les changements.

Dans ces cas, tout semble fonctionner correctement. Après les sauvegardes, le contexte temporaire signale qu'il a 0 objet enregistré et que le contexte principal contient un objet supplémentaire. Cependant, il existe un cas où la création d'un "nouvel" objet inclut un autre objet qui a une relation avec ce nouvel objet. Donc, pour cet objet, je crée le nouvel objet, crée l'objet "enfant" et le place sur le parent. Il y a donc 2 NSManagedObjects. J'effectue une "sauvegarde" de la même manière - le contexte temporaire est sauvegardé, puis le primaire est sauvegardé par la suite. Le problème est que mon contexte temporaire indique toujours qu'il a 2 objets enregistrés après la sauvegarde est terminée. L'objet principal indique également qu'il a 2, et ils affichent tous correctement.

Je peux corriger cela en effectuant une "réinitialisation" sur le contexte temporaire après avoir effectué la "sauvegarde" sur le contexte temporaire. Cependant, cela ne semble pas juste. Pourquoi devrais-je faire ça? Pourquoi mon contexte temporaire signale-t-il toujours les objets enregistrés même après avoir effectué une sauvegarde?

EDIT: Je peux également résoudre ce problème en exécutant "refreshObject: object mergeChanges: NO" sur l'objet à partir du contexte temporaire après avoir effectué l'enregistrement sur le contexte temporaire. Cela ressemble à la meilleure solution pour l'instant (jusqu'à ce que quelqu'un peut expliquer pourquoi je dois le faire ou pourquoi cela se produit). Ma conjecture est que les objets se réfèrent l'un à l'autre, ce qui empêche les objets de se libérer.

Répondre

0

Lorsque vous effectuez une opération de sauvegarde sur MOC, l'objet est enregistré dans le MOC parent du stockage persistant. Mais l'objet sera toujours conservé par MOC en mémoire.

Par défaut, les références entre un objet géré et son contexte sont faibles. L'exception à cette règle est qu'un contexte d'objet géré conserve une référence forte à tous les objets modifiés (insérés, supprimés et mis à jour) jusqu'à ce que la transaction en attente soit validée (avec sauvegarde :) ou rejetée (avec réinitialisation ou annulation).Si vous pensez que cet objet n'a plus besoin d'être plein pour le futur ou que des alarmes sont générées (à la volée dans un magasin de mémoire), vous voudriez couper l'objet graphique en transformant chaque chose en erreur en utilisant "refreshObject" : objet mergeChangements: NO "

+0

Il semble que l'exécution d'un "refreshObject" ou "refreshAllObjects" ne provoque pas d'effets secondaires indésirables à mon application. Une fois que le "sauvegarder" se produit sur le contexte primaire, mon contrôleur de résultats récupérés est averti de la modification avec succès (avec ou sans vidage du contexte temporaire). Il semble que la réalisation de l'actualisation est ma meilleure option. – CoBrA2168

+0

En actualisant les objets, en fonction de votre intervalle de stabilité, les Données de base retournent dans le magasin. Il y a un impact sur les performances lorsque vous appelez le rafraîchissement et il doit être utilisé avec parcimonie. Core Data est très bon pour gérer sa propre mémoire. Ne vous impliquez que lorsque vous avez un problème de performance réel. –

+0

Aucun problème de performance réel, essayant juste de l'empêcher de se produire dans le futur. J'ai commencé à étudier ceci et à changer mon modèle de base de données en utilisant des instruments - j'ai noté que NSManagedObjects supprimé demeurait en mémoire. Je n'ai pas trouvé de preuves ou de documents concrets indiquant que c'était un comportement attendu. – CoBrA2168

0

Pourquoi êtes-vous considéré avec le nombre d'objets enregistrés? Les objets enregistrés sont simplement une liste d'objets dont le contexte est conscient. Puisque ce contexte créait ces objets, il continuerait naturellement à les connaître même après la sauvegarde. Les données de base ne purgent pas les objets après une sauvegarde.

Me dit que cela fonctionne comme prévu.

+0

Voir, je ne savais pas si c'était le comportement prévu ou non. Ce qui semble indiquer que quelque chose ne va pas, c'est que même après avoir effectué une opération de "suppression" sur les objets en question, le contexte temporaire indique toujours qu'il a ces objets enregistrés en mémoire. – CoBrA2168

+0

Oui et il les gardera enregistrés pour une période de temps après. À moins d'avoir une raison particulière d'accéder à registeredObjects, cela n'a pas vraiment de valeur dans les opérations quotidiennes. C'est un peu comme "-retainCount" dans la journée, quelque chose qui semble utile mais n'a finalement aucune valeur pour "nous" (développeurs non-Apple). –