2009-02-05 3 views
6

J'ai une application qui permet à l'utilisateur de visualiser, de manipuler et de gérer une collection d'objets Schedule. Différentes parties de l'application ont besoin d'accéder à ces données. J'ai essayé de faire de la collection un singleton, mais je n'ai pas trouvé ça très propre.Où placez-vous des données d'application globales dans une application iPhone?

J'ai récemment changé pour stocker les données globales dans la classe AppDelegate et en utilisant:

MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
[delegate.myGlobalData doSomething]; 

Ce qui élimine le besoin de mes données globales comme un singleton, mais il est vraiment juste en profitant du singleton UIApplication.

Il n'y a vraiment pas un seul contrôleur de vue primaire où il est logique de le stocker dans mon cas. Je me demandais donc quelles différentes stratégies les gens utilisent pour résoudre ce problème.

Répondre

6

Si vous avez un modèle de données central qui doit être accessible à plusieurs contrôleurs, il n'y a rien de mal à utiliser un singleton pour gérer les données - un "sharedManager" est exactement ce que le scénario exige. C'est essentiellement ce que Apple fait avec son API de carnet d'adresses pour manipuler les contacts. Ils utilisent une API de style C, mais il s'agit d'obtenir une référence à la base de données du carnet d'adresses partagé, puis de l'utiliser dans les prochains appels. L'utilisation du délégué de l'application fonctionne également, mais comme vous le constatez, c'est vraiment la même chose. Vous désignez le délégué de l'application singleton comme propriétaire du modèle de données, ce qui est également OK.

NSUserDefaults peut être abusé de cette façon, mais ce n'est vraiment pas son but. En plus d'être un peu moche, il impose également des restrictions sur le type de données que vous pouvez stocker. Votre propre modèle peut stocker toutes les données que vous aimez, mais NSUserDefaults n'est pas aussi flexible. L'utilisation de SQLite ou d'une liste de propriétés ou autre pour stocker les données dans un fichier est vraiment orthogonale à la question de savoir comment les gérer. À partir de votre description, une approche singleton semble raisonnable, et ce singleton peut écrire dans des fichiers de quelque façon que ce soit logique pour les données avec lesquelles vous travaillez.

+0

Si vous êtes tenté de baisser la note (comme quelqu'un vient de le faire), s'il vous plaît regardez la date à laquelle il a été écrit. À l'époque, iPhone OS 2.2 (pas iOS) était à jour et Core Data n'était pas disponible sur les iPhones. –

4

De nombreuses personnes stockent tout dans AppDelegate et accèdent aux données via le délégué [[UIApplication sharedApplication]].

Si les données sont supposées être persistantes, vous pouvez également utiliser le singleton NSUserDefaults.

Si les données sont volumineuses, vous avez peut-être besoin de SQLite.

Ceci est pour les données "globales" comme vous l'avez demandé.

Si vos contrôleurs de vue sont organisés en arborescence, mieux vaut passer les données requises du parent UIViewController à l'enfant UIViewController.

Questions connexes