2017-03-03 6 views
2

Ich habe zwei Klassen, die NSNotification verwenden, um miteinander zu kommunizieren.Benachrichtigung zweimal ausgelöst, obwohl Beobachter nur einmal hinzugefügt wurde

Derzeit habe ich ein Problem mit der Benachrichtigung zweimal ausgelöst, ich habe doppelt/triple/noch mehr überprüft, dass Beobachter nicht mehr als 1 Mal hinzugefügt wird, Benachrichtigung nicht zweimal gebucht, hat globale Suche auf meinem Projekt für die gleiche Benachrichtigung.

Mein Code ist wie unten


hinzugefügt Mitteilung Observer

[[NSNotificationCenter defaultCenter] removeObserver:self name:notification_deleteMediaFromGallery object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationReceiver:) name:notification_deleteMediaFromGallery object:nil]; 

Mitteilung Empfänger

- (void)notificationReceiver:(NSNotification*)notification { 
    if ([notification.name isEqualToString:notification_deleteMediaFromGallery]) { 
     if ([[notification.userInfo objectForKey:@"kind"] integerValue]==GalleryKindPhoto) { 
      //My statements 
     } 
     else if ([[notification.userInfo objectForKey:@"kind"] integerValue]==GalleryKindVideo) { 
      //My statements 
     } 
    } 
} 

Nachmeldung

dispatch_async(dispatch_get_main_queue(), ^{ 
    [_browser reloadData]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:notification_deleteMediaFromGallery object:nil userInfo:@{@"index":@(_browser.currentIndex), @"kind":@(self.kind), @"function":[NSString stringWithFormat:@"%s",__PRETTY_FUNCTION__]}]; 
}); 

ich auch this solution von EmptyStack versucht haben, aber es ist nicht an die Arbeit.

Ich werde Ihnen sehr dankbar sein, wenn Sie mir helfen könnten, dieses Problem zu lösen.

Danke.

bearbeiten

HINWEIS

I Beobachter in meinem viewDidLoad hinzugefügt haben, und kann nicht hinzufügen/entfernen Beobachter aus viewwillappera/ViewWillAppear oder ViewDidAppear/viewdiddisappear weil die nächste Viewcontroller, die auf geschoben werden Aktuelle Viewcontroller wird Benachrichtigungen notieren

+0

Vielleicht u dies versucht haben, aber könnten Sie uns sagen, was passiert, nachdem Sie einige print-Anweisung an beiden Orten hinzufügen; eine wo du postest und eine wo du dich registrierst – humblePilgrim

+0

@humblePilgrim yeah ich habe es versucht, es protokolliert einmal, wo ich meine Benachrichtigung aber im Empfänger protokolliert es zweimal mit der gleichen Adresse Nummer der Benachrichtigung –

+0

Ich werde Protokoll der Benachrichtigung in etwa einer Stunde –

Antwort

0

Ich denke, Sie müssen dealloc Methode in Ihrem View-Controller schreiben. Und entfernen Sie alle Beobachter Mitteilung in dealloc Methode,

- (void)dealloc 
{ 
    // Deregister observer 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:notification_deleteMediaFromGallery object:nil]; 
} 
+0

Nun, danke für die Antwort, aber ich glaube nicht, dass Dealloc-Methode aufgerufen wird, da diese Klassen meine Viewcontrollers sind, wird Popcall zurück aufrufen '- (void) viewWillDisappear : (BOOL) animiert' und '- (void) viewDidDisappear: (BOOL) animiert'.BTW ich habe einen anderen Hinweis in meinem Kopf, lemme das ausprobieren –

+0

Laut meinem Knowladge müssen Sie addObserver in ViewDidLoad() Methoden hinzufügen und entfernen Sie diese in Dealloc-Methode. Wenn Sie in viewDidDisappear entfernen möchten, müssen Sie Code für addObserver in viewWillappear-Methode schreiben. –

+0

Kein Freund, ich habe den Beobachter in meinem 'viewDidLoad' hinzugefügt, und ich kann Beobachter in' viewdiddisappear' nicht entfernen, weil der nächste Viewcontroller die Benachrichtigung posten wird. und yeah die Dealloc-Methode wird nie aufgerufen werden, weil Dealloc aufgerufen wird, wenn das Objekt vollständig aus dem Speicher entfernt wurde, für mehr Abstand bitte [überprüfen Sie diese Antwort] (http://stackoverflow.com/a/30332523/3308174) –

-2
Hi please make sure your method is not calling two time from where you are firing notification. 

& please add your notification observer in viewWillDisappear method. 
+0

Bitte klären Sie Ihre Antwort –

+0

Jetzt lösen Sie es mit Ihrem eigenen: D – morroko

+0

Kein Problem Kumpel, ich werde, kann jetzt oder später –

Verwandte Themen