2010-12-22 16 views
1

Ich habe einen Beobachter für meine Methode hinzugefügt:Timed Wähler ausgeführt nie

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(closeViewAfterUpdating) 
              name:@"labelUpdatedShouldReturn" 
              object:nil]; 

Dann meine relevanten Methoden:

-(void)closeViewAfterUpdating; { 
NSLog(@"Part 1 called"); 
[self performSelector:@selector(closeViewAfterUpdating2) withObject:nil afterDelay:2.0]; 
} 

-(void)closeViewAfterUpdating2; { 
NSLog(@"Part 2 called"); 
[self dismissModalViewControllerAnimated:YES]; 
} 

Der einzige Grund, warum ich diese Methode in zwei Teile geteilt haben, ist so dass ich eine Verzögerung haben kann, bevor die Methode ausgelöst wird.

Das Problem ist, die zweite Methode wird nie aufgerufen. Meine NSLog Ausgabe zeigt Part 1 called, aber es feuert nie Teil 2. Irgendwelche Ideen?

EDIT: Ich rufe die Benachrichtigung von einem Hintergrund-Thread, macht das einen Unterschied aus?

Hier ist, wie ich mein Hintergrund-Thread zu erstellen:

[NSThread detachNewThreadSelector:@selector(getWeather) toTarget:self withObject:nil]; 

und in getWeather ich habe:

[[NSNotificationCenter defaultCenter] postNotificationName:@"updateZipLabel" object:textfield.text]; 

Auch Aufruf:

[self performSelector:@selector(closeViewAfterUpdating2) withObject:nil]; 

tut Arbeit .

EDITx2: Ich habe es behoben. Nur benötigt, um die Benachrichtigung in meinem Haupt-Thread zu posten und es hat gut funktioniert.

+0

Ich kann das beschriebene Verhalten nicht duplizieren. Ich habe ein Programm erstellt, das nur die 'closeViewAfterUpdating' Methode in der Hauptfunktion aufruft und den Runloop ausführt, und' closeViewAfterUpdating2' wird zwei Sekunden später wie erwartet ausgeführt. – Chuck

Antwort

1

Der Hintergrund Thread ist das Problem. Es hat eine nicht laufende Laufschleife, daher wird der Selektor nie aufgerufen. Lassen Sie das NSRunLoop- oder CFRunLoopRef-Objekt des Threads einfach ausgeführt, während der Selektor nicht ausgelöst wird.

+0

Verlangsamen Sie eine Minute Genie. Du hast mich im Bereich der Laufschleife verloren. Können Sie bitte weiter ausführen? –

+0

Das klingt richtig. Aber Sie werden wahrscheinlich merkwürdige Abstürze usw. verursachen, je nachdem, was Sie tun, da diese Benachrichtigung im Hintergrund-Thread erscheint, wenn Sie von dort aus benachrichtigt werden. Sie sollten performSelectorOnMainThread aufrufen, um vom Hintergrund zum wichtigsten "normalen" Thread zu kommunizieren, es sei denn, Sie sind mit @Syronize und anderen Konzepten vertraut. –

+0

Bitte überprüfen Sie meine Bearbeitung, um zu sehen, wie ich es nenne. –

0

Ich habe versucht Ihren Code und es funktioniert gut auf meiner Seite. Sie können etwas im Hintergrund tun, das Ihren Selektor unterbricht.

0

Sie haben ein Semikolon in der Methodendefinition:

-(void)closeViewAfterUpdating2; { 

Ist das in dem Code oder ein Kopieren/Einfügen-Problem? Das wäre das Problem warum man es nie genannt hat.

+0

Es ist im Code vorhanden, und das Entfernen des Semikolons behebt das Problem nicht. Ich dachte immer, dass es nach der Methodendefinition ein Semikolon gibt, stimmt das nicht? –

+0

Es wird in der Deklaration in der Header-Datei benötigt. Die Definition in der .m-Datei sollte kein Semikolon erhalten. – Mike

+0

Ich nehme das zurück, es ist nur eine Frage des Stils: http://www.mail-archive.com/[email protected]/msg46310.html – Mike

Verwandte Themen