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?
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
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 ...
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.
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.
-viewWillAppear:
+ -viewWillDisappear:
est meilleur que -viewDidAppear:
+ -viewDidDisapear:
, car ils sont toujours appelés le même nombre de fois.