2009-03-01 12 views
1

Ich habe einen NSTimer der Einrichtung ist wie folgt:Erhalten Rückgabewert von NSTimer des Ziel

[NSTimer scheduledTimerWithTimeInterval:0.5 target:timerTarget selector:NSSelectorFromString(targetSelector) userInfo:nil repeats:YES]; 

Wie kann ich den Rückgabewert der timerTarget Methode bekommen?

Antwort

5

Sie können nicht, weil es keinen Rückgabewert gibt.

Quoth der documentation of the scheduledTimerWithTimeInterval::::: method:

Der Wähler muss die folgende Signatur:

- (void)timerFireMethod:(NSTimer*)theTimer 

Jetzt Sie, könnte erklären, um Ihre Methode anders und dann einen Wert in sie zurück, aber dann hat Ihre Methode eine andere Signatur als NSTimer erwartet. Das wird jetzt gut funktionieren, aber es ist nicht garantiert, dass es in der Zukunft funktioniert - es kann jederzeit unterbrochen werden, insbesondere eine Änderung der Laufzeit.

Genauer gesagt, da NSTimer keinen Rückgabewert erwartet, gibt es keine Vorkehrungen, einen zu erhalten und ihn überallhin zu übergeben.

Darüber hinaus, wie ich in meinem Kommentar zu Adams Antwort sagte, Ihr Anruf an scheduledTimerWithTimeInterval::::: nur einmal zurück, und (wie Adam sagte) es tut es sofort. Sie erhalten nicht alle 0,5 Sekunden einen Rückgabewert, da Sie nicht alle 0,5 Sekunden eine Rückgabe erhalten - Sie erhalten eine Rückgabe nur (pro Timer).

Welche Informationen Sie auch in Ihrer Timer-Methode herausfinden, müssen Sie entweder dort reagieren oder eine Nachricht mit den Informationen von dort an eine andere Methode senden.

5

Was machst du mit dem Rückgabewert? Das Ziel wird 0,5 Sekunden später asynchron ausgeführt. Der Aufruf an scheduledTimerWithTimeInterval:target:selector:useInfo:repeats: kehrt sofort zurück, zu diesem Zeitpunkt wurde das Ziel nicht ausgeführt. Wenn Sie wirklich den Rückgabewert jetzt benötigen, dann kümmern Sie sich nicht um einen Timer und rufen Sie den Selektor nur normal auf.

+0

Ich brauche den Rückgabewert alle 0,5 Sekunden. Das Ziel überwacht einen Wert, der sich häufig ändert, und gibt diesen Wert zurück, sodass ich sehen kann, ob tatsächlich eine Änderung aufgetreten ist. – macinjosh

+1

Dann sollten Sie auf die Änderung der Timer-Methode reagieren. Denken Sie daran, dass tiledTimerWithTimeInterval ::::: nur einmal * zurückgibt. Es kehrt nicht für jeden Anruf zum Timer einmal zurück. Sie rufen terminatedTimer ... ::::: einmal auf, so dass es einmal zurückkehrt. –

1

Wenn Sie Adam's gute Antwort folgen, wenn Sie glauben, dass Sie den Rückgabewert der angepeilten Methode benötigen, nachdem sie ausgeführt wurde, dann wollen Sie wahrscheinlich die zielgerichtete Methode selbst weiterführen.

Zum Beispiel können Sie den Parameter "userInfo" verwenden, um einen Verweis auf das interessierte Objekt (self?) Weiterzuleiten. Die zielgerichtete Methode könnte dann, anstatt einen Wert zurückzugeben, den aktualisierten Wert mit einem vorab angeordneten Selektor an self senden. Zum Beispiel in Ihrer Zielmethode, könnte man mit so etwas wie Ende:

[[theTimer userInfo] setWhatever:blah]; 

Konzeptionell brauchen Sie Adam Rat und die Tatsache zu berücksichtigen, dass das Verfahren durch den Timer aufgerufen wird geschieht in der Zukunft zu nehmen und wenn Sie wollen verbinden Sie sich zurück zu einer bestimmten Klasse und ihrem Workflow, Sie müssen es irgendwie selbst verbinden.

Verwandte Themen