2009-09-30 5 views
12

Je travaille sur une application Core Data non basée sur des documents.Enregistrement automatique avec Cocoa et Core Data

Je souhaite que les modifications soient enregistrées au fur et à mesure. C'est ce que l'utilisateur attend de ce type d'application. C'est aussi ce que Apple a implémenté dans iPhoto ou iTunes.

Une approche de force brute serait de mettre en place une minuterie à enregistrer fréquemment. La méthode déclenchée par l'enregistrement avalera alors toutes les erreurs de validation pour ne pas déranger l'utilisateur. Seulement en quittant, l'utilisateur sera mis en alerte pour organiser les données afin qu'il puisse enregistrer. À mon humble avis, cette approche pue.

Donc, je pense, il doit y avoir un moyen d'économiser quelque chose comme le protocole NSEditor. Chaque fois que l'utilisateur (ou un contrôleur) a fini d'éditer les données, le délégué de l'application devrait en quelque sorte être informé d'un déclenchement d'une opération de sauvegarde. Chose est que je ne sais pas trop où chercher.

Je pense que pour des opérations plus complexes, qui peuvent nécessiter certaines validations croisées, je présenterais à l'utilisateur un bit d'interface lié à un dédié.

+0

Si vous acceptez déjà l'annulation, enregistrez-la simplement à chaque fois que vous appuierez quelque chose sur la pile d'annulation. –

+0

Je ne supporte pas encore Annuler. Je n'utilise que ce que CoreData fournit. Mais vous faites un solide argument en faveur d'un soutien étendu à Undo. –

Répondre

14

À la fin de chaque événement dans une application AppKit, CoreData exécutera un -processPendingTransactions pour vous.

Un effet secondaire de ceci est que si vous vous êtes enregistré avec votre NSManagedObjectContext pour recevoir des notifications de modification, vous serez appelé à la fin de chaque événement. Ainsi, par exemple, dans votre gestionnaire de notification, vous pouvez simplement appeler le contexte pour sauvegarder. Cependant, vous pourriez être paranoïaque en faisant une sauvegarde sur un contexte dans un contexte de rappel, donc vous vous sentirez probablement mieux si vous avez fait un execSelector: @selector (save :) afterDelay: pour pousser le enregistrer jusqu'à ce que le -processPendingTransactions soit terminé.

Vous pouvez même faire une annulation précédente sur le sélecteur -save: et avoir le retard d'environ 5 secondes, donc si l'utilisateur ou l'application est au milieu d'un BUNCH de changements, ils vont tous fusionner en une seule sauvegarde .

Et, en fait, c'est exactement comme cela qu'a fonctionné Delicious Library 1.0-1.09.

-Wil

+0

Merci pour le conseil. Tant votre suggestion et l'idée de ferroutage sur le gestionnaire d'annulation semblent excellentes. Bien sûr, votre commentaire soulève une question: pourquoi les versions plus récentes de Delicious Library n'utilisent-elles plus cette technique? –

+0

J'ai décidé d'essayer d'enregistrer immédiatement au lieu de prendre du retard, car je cours plusieurs threads à la fois et quand, par exemple, vous créez une couverture dans le thread principal, vous voulez VRAIMENT que les threads d'arrière-plan graphique immédiatement, pas dans les trois secondes lorsque vous sauvegardez automatiquement. –

+0

Alors, appelez-vous toujours performSelector: @selector (save :) afterDelay: du tout ou utilisez-vous une autre méthode pour sauvegarder automatiquement le contexte? –

Questions connexes