2015-04-20 15 views
7

Zaimplementowałem NSNotificationCenter w mojej aplikacji. Wysyłam powiadomienie po zakończeniu dekodowania obrazu. Po raz pierwszy dekodowanie obrazu zostanie wykonane 8 razy. Tak więc powiadomienie powinno wysłać 8 razy. Ale wywołuje 64 razy (8 * 8).NSNotificationCenter dzwoni wiele razy

Oto mój kod, jak i wdrożyliśmy -> // Inicjalizacja

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
if (self) { 

    [[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(getHRImage:) 
                  name:@"DecodeComplete" object:nil];} 

// wywołanie metody

-(void)getHRImage:(NSNotification *) notification 
{ 

if ([[notification name] isEqualToString:@"DecodeComplete"]) 
    NSLog (@"Successfully received the DecodeComplete notification! "); 
}` 

// dealokacji

- (void) dealloc 
{ 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:self]; 
    //[super dealloc]; 
} 

// post Powiadomienie

[[NSNotificationCenter defaultCenter] postNotificationName:@"DecodeComplete" object:self]; 

Ktoś może zasugerować mi, gdzie popełniłem błąd.

Z góry dziękuję.

// Wywołanie metody jest tak (wywołanie 8 razy)

-(void)decode 
{ 
    NSLog(@"---------- Decoding is Complete ---------"); 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MdjDecodeComplete" object:self]; 

} 
+2

Nie pokazałeś wystarczającej ilości kontekstu dla połączenia z "postNotificationName", aby podać odpowiedź, ale musisz wywoływać to 64 razy - więc podejrzewam, że jest jakiś problem z twoją strukturą pętli. Proponuję, abyś dodał więcej kodu lub umieścił punkt przerwania na 'postNotificationWithName' i sprawdził, gdzie jest on nazywany – Paulw11

+0

czy sprawdziłeś, czy twoja metoda' dealloc' jest wywoływana czy nie? –

+0

wydaje się, że dodajesz obserwować wiele razy, a twoja poprzednia dodana obserwacja nie jest usunięta, więc otrzymujesz metodę getImage wielokrotnie. –

Odpowiedz

5

Rozwiązanie: I ponownie sprawdzić mój kod, initWithFrame: (CGRect) Rama dzwoni 8 razy i dodając NSNotification obserwatorowi 8 razy.

Więc zmieniłem mój kod w ten sposób, --- >> Inicjalizacja.

static bool note=YES; 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    if(note) 
[[NSNotificationCenter defaultCenter] addObserver:self 

                selector:@selector(getHRImage:) 
                 name:@"DecodeComplete" object:nil]; note=NO;} 

--- >> dealokacji

- (void) dealloc 
    { 
    note=true; 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:nil]; 
//[super dealloc]; 
} 

Teraz addObserver metoda dzwoni tylko raz więc mój problem został rozwiązany. Dziękuję wszystkim za cenne wskazówki.

-2

- (void) dealloc nie będzie nazywany w środowisku ARC. Instread można usunąć obserwator zanim go dodać tak:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"DecodeComplete" object:self]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getHRImage:) name:@"DecodeComplete" object:nil];  
    } 
} 
+5

dealloc zostanie wywołany w ARC, więc wszelkie dostosowanie w dealloc jest nadal legalne. Musisz tutaj popełnić jakiś błąd. – user3349433

+1

@Lazy_Cluctch to nie działa. –

+0

Nie działa to z dwóch powodów: 1. '-dealloc' jest wykonywane jak wspomniano przez @ user3349433, 2. usunąłoby * nową * widok widoku, a nie istniejącą. –