2010-06-21 4 views
12

Je travaille sur une application soutenue par Core Data. À l'heure actuelle, je sauvegarde le contexte d'objet au fur et à mesure que j'ajoute ou supprime une entité vers et depuis le contexte. J'ai peur que ça affecte la performance, donc je pensais retarder la sauvegarde. En fait, je pourrais le retarder jusqu'à ce que l'application se termine. Est-ce trop risqué d'enregistrer les données uniquement lorsque l'application est sur le point de fermer? À quelle fréquence devrais-je appeler la sauvegarde sur Object Context?À quelle fréquence devrais-je enregistrer les données de base?

Je pensais avoir un thread séparé gérer l'enregistrement: il attendra sur un sémaphore. Chaque fois qu'une partie de l'application appelle une méthode helper/util pour enregistrer les données de base, elle décrémente le sémaphore. Quand il est à zéro, le "fil de sauvegarde" fera une sauvegarde une fois et il incrémentera le sémaphore à, par exemple, 5, puis se remettra en veille.

Toute bonne recommandation? Merci!

Répondre

9

Vous devriez enregistrer fréquemment. Les performances réelles de l'opération de sauvegarde ont beaucoup à voir avec le type de magasin persistant que vous utilisez. Les magasins binaires et XML étant atomiques, ils doivent être entièrement réécrits sur le disque à chaque sauvegarde. Au fur et à mesure que le graphique de votre objet augmente, cela peut ralentir votre application. D'autre part, le magasin SQLite est beaucoup plus facile à écrire de façon incrémentielle. Donc, bien qu'il y ait des choses qui soient écrites au-dessus et au-delà des objets que vous enregistrez, le temps système est beaucoup plus bas qu'avec les types de magasin atomique. Les sauvegardes affectant seulement quelques objets seront toujours rapides, indépendamment de la taille globale du graphe d'objet. Cela dit, si vous importez des données dans une boucle, disons, j'attendrais jusqu'à la fin de l'opération complète pour sauvegarder plutôt que d'enregistrer à chaque itération. Votre objectif principal devrait être d'empêcher la perte de données. (J'ai trouvé que les utilisateurs ne se soucient pas beaucoup de cela!) La performance devrait être une seconde étroite. Vous devrez peut-être faire un peu de travail pour équilibrer la fréquence d'économie par rapport à la performance, mais la solution que vous avez décrite ci-dessus semble être trop lourde, sauf si vous avez identifié un problème de performance spécifique et significatif.

+0

Merci pour la réponse rapide. Mes objets ne sont pas énormes, mais l'objet est un peu compliqué. Le magasin sous-jacent est SQLite, donc comme vous l'avez dit, ça devrait être plutôt bien. J'ai récemment rencontré un problème supplémentaire: je crée un objet entité dans le contexte et je l'enregistre. Dans un bref instant, si je supprime cette entité (récupérée plus tard en utilisant FetchedResultsController), j'obtiendrai une erreur qui a quelque chose à voir avec la cohérence interne. Je pense que c'est parce que le contexte n'a pas mis à jour le graphe d'objet en mémoire? – Justin

+1

J'ajouterais à cela que vous voulez que votre fréquence de sauvegarde réelle soit une variable ou un '# define' de sorte qu'une fois que vous êtes en test, vous pouvez affiner votre fréquence de sauvegarde et regarder les résultats dans Instruments. –

0

La meilleure façon, je pense, est de sauvegarder après chaque objet. Si quelque chose se produit comme un accident soudain, rien ne sera perdu.

Certaines améliorations des performances, si vous ajoutez un grand nombre d'objets, sont de traiter par lots. Ajouter tous les objets au contexte que sauvegarder. C'est bien par exemple si vous ajoutez beaucoup d'objets dans une boucle. Votre idée est similaire, mais il pourrait s'écouler beaucoup de temps entre les sauvegardes, au cours desquelles le programme pourrait tomber en panne.

Je ne pense pas que l'ajout d'un seul objet serait un gros problème de performances. Quelle est la taille de vos objets, contiennent-ils beaucoup de données?

+0

NE JAMAIS sauvegarder après chaque panne. Cela tue la performance morte. –

+1

Enregistrer après chaque accident? Je pense que c'est une faute de frappe. Il est certain que si l'utilisateur dictait les sauvegardes en créant des objets, l'utilisateur ne pouvait pas créer suffisamment d'objets pour ralentir l'application. Si vous pensez que cela ralentit votre application, vous risquez de ne pas économiser suffisamment. S'il vous plaît fournir des preuves, tous mes repères ont été acceptables. –

Questions connexes