Je cherche à pouvoir référencer certains états/objets n'importe où dans mon application. Par exemple, un utilisateur se connecte à son application, je dois appeler un service Web et récupérer les informations des utilisateurs. Ensuite, je veux pouvoir accéder à ces informations de n'importe où dans l'application avec quelque chose comme ce qui suit:
myAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
user = delegate.u;
Définir une variable d'instance en tant qu'objet utilisateur dans le délégué d'application et la référencer à partir de là en cas de besoin est-il une mauvaise façon de procéder? Je le place généralement là lors de la connexion de l'utilisateur.
Je voulais savoir comment les pros gèrent celui-ci.
Normalement, vous ne devez connecter des éléments au délégué d'application que s'ils:
Pour tout le reste, vous devez créer un singleton qui gère l'accès à ces derniers.
Jason Coco a suggéré le routage via le contrôleur d'application. Dans mes programmes, j'évite normalement cela, car je pense que cela met trop de responsabilité au niveau supérieur - je pense que les choses devraient s'autogérer si possible et que la gestion de niveau supérieur ne devrait être utilisée que lorsqu'il y a un besoin de coordination entre les pairs. modules de niveau.
Je ne vais pas lier mon propre blog, mais si vous me cherchez sur Google et sur des singletons, vous trouverez probablement un article que j'ai écrit plus en détail.
Matt est un peu trop modeste. Son message sur le sujet est l'un des meilleurs que j'ai lus et mérite un lien. http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
Je ne vois aucun problème avec votre approche. J'utilise généralement un singleton pour gérer cette situation:
// MyCommon.h:
@interface MyCommon
class MyCommon : NSObject
{
int user;
};
@property(assign) int user;
+ (MyCommon *)singleton;
@end
// MyCommon.m:
@implementation MyCommon
static MyCommon * MyCommon_Singleton = nil;
+ (MyCommon *)singleton
{
if (nil == MyCommon_Singleton)
{
MyCommon_Singleton = [[MyCommon_Singleton alloc] init];
}
return MyCommon_Singleton;
}
@end
Le singleton MyCommon
est ensuite utilisé n'importe où dans mon application comme suit:
int user = [MyCommon singleton].user;
Habituellement, vous demanderiez au contrôleur de votre application ces informations et il serait responsable de savoir comment les stocker/les rechercher dans le modèle de données existant. Le contrôleur de votre application peut ou non être le même que le délégué des applications (dans la plupart des applications simples, c'est la même chose).