7

Ich habe NSNotificationCenter in meiner Anwendung implementiert. Ich sende Benachrichtigungen, wenn eine Bilddekodierung durchgeführt wird. Zum ersten Mal wird die Bilddecodierung 8 Mal durchgeführt. So soll die Benachrichtigung 8 mal senden. Aber es ruft 64 mal (8 * 8) auf.NSNotificationCenter ruft mehrere Male an

Hier mein Code ist, wie ich umgesetzt haben -> // Initialisation

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

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

// Methode aufrufen

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

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

// Ausplanung

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

// Beitrag Benachrichtigung

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

Einige können mir vorschlagen, wo ich falsch gemacht habe.

Vielen Dank im Voraus.

// Aufruf der Methode ist wie folgt (Aufruf 8mal)

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

} 
+2

Sie haben nicht genügend Kontext um Ihren Aufruf von "postNotificationName" gezeigt, um eine Antwort zu liefern, aber Sie müssen diese 64 Mal aufrufen - also vermute ich, dass ein Problem mit Ihrer Schleifenstruktur vorliegt. Ich schlage vor, dass Sie entweder mehr Code posten oder einen Breakpoint auf 'postNotificationWithName' setzen und sehen, wo er aufgerufen wird – Paulw11

+0

Haben Sie überprüft, dass Ihre' dealloc' Methoden aufgerufen werden oder nicht? –

+0

Es scheint, dass Sie hinzufügen, beobachten Sie mehrmals und Ihre vorherige hinzugefügte Beobachtung wird nicht entfernt, so erhalten Sie getHRImage-Methode mehrmals. –

Antwort

5

Lösung: ich meinen Code erneut überprüft, die Initwithframe: (CGRect) Rahmen 8mal ruft und das Hinzufügen von NSNotification Beobachter 8 mal.

Also habe ich meinen Code so geändert, --- >> Initialisierung.

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

--- >> Ausplanung

- (void) dealloc 
    { 
    note=true; 

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

Jetzt addObserver Methode ruft nur einmal so mein Problem gelöst ist. Vielen Dank für Ihre wertvolle Anleitung.

-2

- (void) dealloc nicht in ARC-Umgebung aufgerufen werden. Instread können Sie Ihr Beobachter es so entfernen, bevor hinzufügen:

- (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 wird in ARC aufgerufen, so dass Anpassungen in dealloc immer noch zulässig sind. Sie müssen hier einen Fehler machen. – user3349433

+1

@Lazy_Cluctch es funktioniert nicht. –

+0

Dies funktioniert nicht aus zwei Gründen: 1. '-dealloc' wird ausgeführt wie von @ user3349433 erwähnt, 2. es würde die * neue * View-Instanz entfernen, keine existierende. –