2015-04-20 24 views
7

Ho implementato NSNotificationCenter nella mia applicazione. Invio una notifica ogni volta che viene eseguita la decodifica delle immagini. la prima volta che la decodifica dell'immagine verrà eseguita 8 volte. Quindi la notifica supponiamo di inviare 8 volte. Ma sta chiamando 64 volte (8 * 8).NSNotificationCenter chiama più volte

Ecco il mio codice come ho implementato -> // inizializzazione

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

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

// metodo di chiamata

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

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

// Deallocation

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

// Messaggio Notifica

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

Qualcuno può suggerirmi dove ho sbagliato.

Grazie in anticipo.

// metodo di chiamata è come questo (chiamando 8 volte)

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

} 
+2

Non hai mostrato abbastanza contesto intorno alla tua chiamata a 'postNotificationName' per fornire una risposta, ma devi chiamarla 64 volte - quindi ho il sospetto che ci sia qualche problema con la struttura del tuo loop. Ti suggerisco di pubblicare più codice o di inserire un punto di interruzione su 'postNotificationWithName' e vedere dove viene chiamato – Paulw11

+0

hai controllato che i tuoi metodi' dealloc' vengano chiamati o meno? –

+0

sembra che tu stia aggiungendo osservazioni più volte e la tua precedente osservazione aggiunta non viene rimossa, quindi stai ricevendo il metodo getHRImage più volte. –

risposta

5

Soluzione: Ho ricontrollato il mio codice, il initWithFrame: telaio (CGRect) sta chiamando 8 volte e aggiungendo NSNotification osservatore 8 volte.

Quindi ho cambiato il mio codice in questo modo, --- >> Inizializzazione.

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;} 

--- >> Deallocation

- (void) dealloc 
    { 
    note=true; 

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

Ora metodo addObserver sta chiamando solo una volta quindi il mio problema è stato risolto. Grazie a tutti per la vostra preziosa guida.

-2

- (void) dealloc non saranno chiamati in ambiente ARC. Instread, è possibile rimuovere il vostro osservatore prima di inserirlo in questo modo:

- (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 sarà chiamato in ARC, quindi qualsiasi personalizzazione in dealloc è ancora legale. Devi fare un errore qui. – user3349433

+1

@Lazy_Cluctch non funziona. –

+0

Questo non funziona per due motivi: 1. '-dealloc' viene eseguito come menzionato da @ user3349433, 2. rimuove l'* nuova * vista dell'istanza, non una esistente. –