2009-08-13 3 views
6

J'essaie de décider si un état de l'application, en particulier l'élément sélectionné dans une liste, doit être stocké dans Core Data ou NSUserDefaults.Quand l'état de l'application appartient-il aux données de base au lieu de NSUserDefaults?

Généralement, je crois que les préférences et l'état de l'application doivent persister dans NSUserDefaults, et les données au niveau du modèle doivent persister ailleurs, par exemple dans les données de base. Mon modèle jusqu'à présent est:

  • Les données doivent-elles être stockées? Si l'utilisateur ne pas l'assurance raisonnable que ce soit, alors jetez-(par exemple, la position du curseur est pas enregistré dans TextEdit)
  • NSUserDefaults:
    1. Si l'application était multi-document, le cadre serait appliquer à tous les documents
    2. Il est concevable que les données seront configurées dans les préférences
    3. Avoir les données en dehors du modèle logique pour le test (permutation plusieurs paramètres par défaut avec un magasin de modèle)
  • modèle niveau
    1. Les données appartiennent clairement comme un attribut d'un objet au niveau du modèle
    2. Les données sont suffisamment grand pour que le stockage en NSUserDefaults causerait des problèmes de performance
    3. Il serait difficile ou à forte intensité pour l'utilisateur recréer les données (ils seraient certainement tenir compte de la perte de ces informations « perte de données »)

Je prévois de stocker l'ordre de tri de certaines entités de base de données. Sans cette information (c'est-à-dire un attribut "sortIndex" ou "order"), chaque instance d'entité devrait être augmentée avec des données provenant des valeurs par défaut de l'utilisateur. Cependant, stocker l'état dans le modèle semble être une pente glissante. Si je stocke l'ordre de tri, il semble également approprié de stocker la sélection, car ils sont à la fois l'état d'une liste. Les données de sélection pour mon cas d'utilisation peuvent en fait être assez importantes. Plus précisément, les icônes d'une liste dépendent de la sélection dans chacune de leurs sous-listes.

Est-ce que quelqu'un a une ligne dure qu'il dessine en ce qui concerne NSUserDefaults vs modèle de données?

Répondre

5

Vous n'avez pas mentionné s'il s'agit d'une application basée sur un document (comme, par exemple, TextEdit) ou d'une application basée sur une bibliothèque (comme, par exemple, AddressBook).

Cela peut vous aider à décider où ces informations doivent être utilisées: supposons une application basée sur des documents. Supposons que ses documents soient placés sous contrôle de version (ceci est réellement possible lors de l'utilisation du type de magasin de données XML de Core Data). Ouvrez l'application, modifiez les commandes de tri du document. Est-ce que ça salit le document? Ce changement vaudrait-il un check-in? Le changement serait-il utile aux autres utilisateurs de ce référentiel?

Généralement, les ordres de tri ne sont pas suffisamment importants pour justifier un stockage basé sur des documents (par exemple, le nom d'enregistrement automatique de NSTableView dans Interface Builder). Mais votre application peut placer une priorité sur le tri (ça sonne comme ça).

Donc, il n'y a pas de règle stricte. Mais je pense que l'idée d'avoir un document sous contrôle de version, potentiellement partagé avec d'autres, fournit un bon cadre intellectuel pour défendre votre cause de part et d'autre.

+0

C'est une application iPhone qui, dans mon cas, relève du scénario de bibliothèque. J'aime le modèle mental de considérer une application multi-document hypothétique, et si le changement rendrait l'application sale. Dans mon cas, la sélection d'une sous-liste modifie la vue de la liste supérieure (en particulier, la sous-sélection change quelle image est affichée à côté d'un élément dans la vue supérieure). En ce qui concerne le tri, je voulais dire que l'ordre de tri est défini par l'utilisateur. Autrement dit, ils peuvent arbitrairement ordonner la liste (comme créer une liste de lecture dans iTunes). – orque

+0

En se basant sur le «est-ce que le document est sale», j'aimerais également ajouter «la modification apportée aux données entraînerait-elle un ajout à la pile d'annulation». Annuler fonctionne à la fois pour les applications basées sur des documents et pour les bibliothèques, ce qui semble être une bonne heuristique. – orque

2

Je suis d'accord avec Rentzsch, mais une autre façon pour la voir:

est la partie de la sélection des données ou est-il des métadonnées? En cas de métadonnées, s'agit-il de métadonnées relatives à un seul document ou est-ce que cet état doit s'appliquer à tout document ouvert par la suite?

Les métadonnées spécifiques au document peuvent être stockées en tant qu'attribut étendu. Par exemple, TextMate stocke la sélection pour un document de cette façon, tout comme BBEdit, MPW et d'autres, utilisés pour stocker les paramètres de tabulation, la taille de la fenêtre, etc. comme ressource dans la branche de ressources. Les métadonnées sont considérées comme facultatives et le document est intact s'il est retiré.

Si la sélection fait partie intégrante des données, alors stockez-la dans les données, en utilisant les données de base si vous vous déplacez de cette façon. Si ce n'est pas une application basée sur un document, alors NSUserDefaults est le chemin le plus simple car sa prise en charge est généralement intégrée aux sous-classes NSView courantes via les liaisons.

+0

Je suis d'accord. J'ai oublié d'indiquer quel était mon modèle existant, alors j'ai corrigé ma question (je crois que c'est la «bonne chose» à faire ici) J'avais du mal à décider si l'information faisait partie intégrante des données ". Avec le modèle de Rentzsch (devrais-je afficher le point sale) cela devient plus facile, – orque

2

Personnellement, je n'ai pas une ligne dure entre les préférences d'enregistrement dans le fichier lui-même ou dans NSUSerDefaults.

Mais je l'ai toujours eu tendance à l'évidence:

  • Préférences de l'application = NSUserDefaults
  • préférences Document = dans le fichier lui-même

Pour état de sélection spécifique, je jugeraient si maintenant que est assez important pour l'utilisateur. Si c'est le cas, et assez important pour se déplacer avec le document vers un autre ordinateur, je le garderais dans le document lui-même.

Si ce n'est pas important (ou applicable) je ne prendrais pas la peine de le sauvegarder du tout.

+0

Je pense que cela m'a fait trébucher car sur iPhone je ne considère pas forcément les applications comme ayant des "documents"; tout est juste des données. L'état d'économie devient beaucoup plus important car la commutation d'applications implique l'abandon et la relance. – orque

+0

Je pense même dans une application iPhone - si l'état de la section dans l'emplacement actuel des utilisateurs est important pour les données, je l'enregistrerais, sinon, je ne dérange pas. On dirait que ça pourrait être, alors je l'enregistrerais avec les données. – Lucien

Questions connexes