Pourquoi mon NSNotification son observateur appelé plusieurs fois?
Dans une Application, j'utilise plusieurs viewcontrollers. Sur un viewcontroller un observateur est initialisé de la façon suivante:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod:) name:@"MyNotification" object:nil];
Même lors du retrait de la NSNotification
avant d'initialiser le nombre d'exécutions de myMethod:
est résumée par le montant de la répétition des vues sur le viewcontroller.
Pourquoi cela se produit et comment puis-je éviter de myMethod: être appelé plus d'une fois.
Note: j'ai fait en sorte en utilisant des points d'arrêt que je n'ai pas fait des erreurs sur l'appel de postNotification plusieurs fois.
Edit: C'est ainsi que ma postNotification ressemble
NSArray * objects = [NSArray arrayWithObjects:[NSNumber numberWithInt:number],someText, nil];
NSArray * keys = [NSArray arrayWithObjects:@"Number",@"Text", nil];
NSDictionary * userInfo = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:self userInfo:userInfo];
edit: même après le déménagement de mon abonnement à viewwillappear: j'obtiens le même résultat. myMethod: est appelée plusieurs fois. (nombre de fois que je recharge la viewcontroller).
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod:) name:@"MyNotification" object:nil];
}
edit: quelque chose semble mal avec mon cycle de vie. ViewDidUnload et dealloc ne sont pas appelé, cependant viewdiddisappear est appelé.
La façon dont je l'ai pousser mon Viewcontroller de la pile est comme suit, où le parent est un tableview sous-classe (en cliquant sur la ligne cette viewcontroller est lancée:
detailScreen * screen = [[detailScreen alloc] initWithContentID:ID andFullContentArray:fullContentIndex andParent:parent];
[self.navigationController pushViewController:screen animated:YES];
Solution:
Mouvement de suppression de nsnotification à viewdiddisappear a fait le tour. Merci pour les conseils!
- votre solution fonctionne pour moi thanq....
- thnx solution : aidé
Vous devez vous connecter pour publier un commentaire.
Selon cette description, une cause probable est que votre viewcontrollers sont conservés et pas libérée lorsque vous pensez qu'ils sont. C'est assez fréquent, même avec l'ARC si les choses sont conservés. Alors, vous pensez que vous avez une seule instance d'un viewcontroller active, alors que vous avez réellement vivre plusieurs instances, et ils ont tous d'écouter les notifications.
Si j'étais dans cette situation, je mettrais un point d'arrêt dans le viewcontroller de la méthode dealloc et assurez-vous qu'il est libéré correctement, si c'est le but de la conception de votre application.
Dans quelles méthodes avez-vous inscrire les observateurs?
Apple recommande que les observateurs devraient être enregistrés dans le
viewWillAppear:
et non dansviewWillDissapear:
Êtes-vous sûr que vous ne vous inscrivez pas à l'observateur deux fois?
Rencontré ce problème dans une application en cours d'exécution rapide. L'application a obtenu la notification une fois lors de son premier lancement. la notification augmente le nombre de fois que vous allez dans l'arrière-plan et de revenir. j'.e
solution:
observer l'application va démissionner actif dans votre vue-contrôleur:
ce sera assurez-vous que votre point de vue contrôleur de supprimer l'observateur de la notification lorsque la vue passe en arrière-plan.
il est tout à fait possible de vous abonner aux notifications
avant auto est initialisé. Et en essayant de se désabonner " moi " qui n'est vraiment pas abonné, et vous obtiendrez tous les mondial myNotification notifications.
Si votre vue a été accroché au bureau de l'IB, l'utilisation -awakeFromNib: comme point de départ pour vous inscrire aux notifications