2009-06-03 9 views
2

Dans l'application iPhone sur laquelle je travaille, j'utilise une classe personnalisée pour gérer les communications réseau avec l'hôte. La classe appelée protocolClass est un ivar dans appDelegate et alloc + init dans la méthode applicationDidFinishLaunching:.Comment faire passer des informations de appDelegate dans l'un des contrôleurs de vue du contrôleur UINavigation

Maintenant que la classe protocolClass reçoit des données de l'hôte, elle appelle la méthode protocolClassDidReceiveData: dans son délégué (que j'ai défini comme appDelegate). Je dois ensuite mettre à jour les données dans l'un des customViewControllers dans UINavigatorController.

Devrais-je simplement ajouter une référence au customViewController que j'ai besoin de mettre à jour dans appDelegate? ou y a-t-il une autre méthode plus efficace?

Si je devais conserver une référence au customViewcontroller, quelles sont les ramifications de l'utilisation de la mémoire?

Merci d'avance.

Répondre

2

Si je vous ai bien compris, vous voulez mettre à jour une vue après qu'un événement se soit produit dans une partie non liée de votre programme.

Pour réduire le nombre de dépendances dans votre code, je recommande d'utiliser un NSNotification au lieu de la variable d'instance plus étroitement couplée. Les notifications sont un concept Cocoa, qui permet à une partie de votre code d'émettre un message semblable à un événement auquel n'importe quel nombre d'auditeurs peut s'inscrire.

Dans votre cas, il ressemblerait à ceci:

tête de AppDelegate:

extern NSString* kDataReceived; 

mise en œuvre de AppDelegate:

NSString* kDataReceived = @"DataReceived"; 

- (void)protocolClassDidReceiveData:(NSData*)data { 
    [[NSNotificationCenter defaultCenter] postNotificationName:kDataReceived 
                 object:self 
                 userInfo:data]; 
} 

dans la mise en œuvre d'une classe d'auditeur intéressé (par exemple votre UIViewController) :

// register for the notification somewhere 
- (id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(dataReceivedNotification:) 
                name:kDataReceived 
                object:nil]; 
    } 
} 

// unregister 
- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

// receive the notification 
- (void)dataReceivedNotification:(NSNotification*)notification 
{ 
    NSData* data = [notification userInfo]; 
    // do something with data 
} 
+0

Merci Nikolai, je vais vérifier notificationCenter out alors. Au début, j'étais juste inquiet à propos de l'utilisation de notificationCenter, ce qui signifie utiliser des ressources système inutiles. – Ben

+0

Je pense que cela aurait été une optimisation prématurée. Si vous regardez le nombre de notifications qui volent autour de toutes les vues et ainsi, je ne pense pas qu'il serait dangereux de poster une notification après avoir reçu des données d'un socket. –

+0

Merci Nikolaï! J'étais googling événement passant dans l'iphone et j'ai vu votre message – ambertch

2

Oui, les notifications sont un bon moyen de le faire. Et quand un modèle veut mettre à jour le contrôleur [c.-à-d. ViewController] - la notification est un bon moyen de le faire. Dans mon cas, j'essaie de découvrir des périphériques utilisant SSDP (en utilisant le AsyncUdpSocket), et je voulais mettre à jour/notifier mon contrôleur de vue lorsque j'ai trouvé le périphérique. Comme cela est asynchrone, lorsque les données sont reçues, j'ai utilisé la notification. Voici la chose simple que je l'ai fait:

Dans le viewDidLoad (j'ai essayé remplaçant init, mais qui ne fonctionne pas bien pour moi) - Je me suis inscrit mon ViewController une notification comme suit:

*NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self 
      selector:@selector(foundController:) 
       name:@"DiscoveredController" 
      object:nil]; 

Voici le sélecteur dans mon ViewController:

// receive the notification 
- (void)foundController:(NSNotification *)note 
{ 
    self.controllerFoundStatus.text = @"We found a controller"; 
} 

dans mon « modèle » [Pas le délégué App - J'ai créé une nouvelle classe que j'utilise pour découvrir les dispositifs « serviceSSDP » tout ce que je faisais était de poster la notification comme suit :

[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil]; 

C'est tout.Cette publication de la notification est quand je reçois la réponse correcte à ma découverte SSDP [spécifiquement dans:

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock 
    didReceiveData:(NSData *)data 
      withTag:(long)tag 
      fromHost:(NSString *)host 
       port:(UInt16)port 

du AsyncUdpSocket.

Questions connexes