web-dev-qa-db-fra.com

Utilisation appropriée d'iPhone par le délégué d'application

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.

58
Coocoo4Cocoa

Normalement, vous ne devez connecter des éléments au délégué d'application que s'ils:

  • Ont été créés à partir du même fichier NIB que le délégué de l'application (c'est-à-dire les éléments d'interface utilisateur statiques dans les interfaces à fenêtre unique)
  • Sont associés à la gestion des événements au niveau de l'application qui passe par le délégué d'application (comme l'élément de menu pour la fenêtre Préférences)

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.

52
Matt Gallagher

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

31
Brad The App Guy

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;
13
e.James

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).

3
Jason Coco