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.
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
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. –
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