web-dev-qa-db-fra.com

Quel est le meilleur moyen d'ajouterObserver/removeObserver avec NSNotificationCenter?

J'ai utilisé addObserver dans viewDidLoad: et removeObserver dans dealloc:. Code:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData)
                                                 name:AnyNotification
                                               object:nil];
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AnyNotification
                                                  object:nil];
}

Mais selon certains articles, il vaut mieux addObserver dans viewDidAppear: et removeObserver dans viewDidDisappear:. Code:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData)
                                                 name:AnyNotification
                                               object:nil];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AnyNotification
                                                  object:nil];
}

Alors, quel est le meilleur moyen d'ajouterObserver/removeObserver?

22
fannheyward

cela dépend de votre scénario. La meilleure approche consiste généralement à ajouter viewDidLoad et à supprimer dealloc et viewDidUnload. Toutefois, dans certains cas, vous utilisez la même méthode dans différentes classes, comme les effets d'interface utilisateur, et souhaitez appeler uniquement la méthode de l'écran en cours à l'aide de la notification. vous devrez ensuite ajouter l'observateur dans viewWillAppear et le supprimer dans viewWillDisappear ou viewDidAppear/viewDidDisappear 

21
Saad

Je le mettrais normalement dans -viewDidAppear: et -viewDidDisapear: (ou -viewWillAppear: et -viewWillDisappear:) simplement parce que, dans tous les cas, je suis tombé sur la notification si la vue est réellement affichée.

C'est probablement une optimisation prématurée (votre code pour gérer la notification peut prendre un certain temps, mais peut être inutile si la vue n'est pas affichée), mais ce n'est plus un code supplémentaire - c'est le même code, mais d'une méthode différente ...

4
Thomas Müller

N'oubliez pas NSKeyValueObservingOptionInitial. Je l'utilise avec viewWillAppear/viewWillDisappear pour que mon interface utilisateur soit toujours mise à jour, même si je cache ce contrôleur de vue, ce qui économise des ressources, car je ne le mettrai pas à jour tant qu'il ne s'affichera plus.

1
Ricardo

La meilleure approche utilisant NSNotifications est en ajoutant l'observateur lorsque vous devez observer les notifications et supprimez-les lorsque vous n'en avez plus besoin .

Cela peut être sur viewDidLoad:, viewWillAppear: ou lorsque l'utilisateur appuie sur un bouton, etc.

Je vais vous donner un petit exemple:

Mon application comporte une barre de tabulation et, dans certains contrôleurs de vue, j'affiche des informations téléchargées sur Internet (un Tweet par exemple). J'ai également un pool de classes pour les nouvelles données du serveur toutes les 2 minutes, et comme le serveur avait de nouvelles données, j'ai mis à jour les informations sur la base de données. Je n'utiliserai pas de modèle de délégué pour écouter les modifications de la base de données, car de nombreux contrôleurs de vue affichent des données, et ce sera une très mauvaise conception de rendre le délégué un tableau et de boucler pour transmettre les données pour chaque contrôleur de vue. Ainsi, dans ce scénario spécifique, le mieux est de poster une notification indiquant à chaque VC que de nouvelles données ont été fournies. 

Si votre VC supprime le délégué lorsque la vue disparaît, seul le représentant actuel recevra la notification et mettra à jour le contenu affiché.

Vous pouvez évidemment mettre à jour le contenu des autres VC avant l'affichage, par exemple avec viewWillAppear:, mais le contenu de VC sera mis à jour non seulement si nécessaire, mais à chaque fois que vous changez d'onglet.

Ce n’est qu’un exemple, où j’ai essayé de vous montrer que, pour NSNotifications, il est difficile de vous conseiller quand ajouter ou supprimer des observateurs lorsque nous n’avons pas la description complète de la façon dont vous modifiez le comportement des applications. 

0
FormigaNinja

-viewWillAppear: + -viewWillDisappear: est meilleur que -viewDidAppear: + -viewDidDisapear:, car ils sont toujours appelés le même nombre de fois.

0
0xa6a