Stoppen Sie eine NSRunLoop von einem timer
Habe ich eine RunLoop mit einem timer, der die updates ein label, das zeigt ein countdown. Ich brauche die RunLoop zu stoppen, sobald der countdown null erreicht, für den Fall, das der timer beendet, die normalerweise ich konnte einfach runUntilDate, mit dem Datum wird das aktuelle Datum + die Zeit auf den countdown. Das problem ist, wenn der Benutzer bricht den countdown ab einem klicken, bevor es fertig ist. Ich weiß nicht, wie zu sagen, die RunLoop zu stoppen, aus den Abbrechen-button-Aktion. Hier ist der code für die RunLoop:
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
[self methodSignatureForSelector:@selector(updateCountdownLabel:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdownLabel:)];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];
Die Methode zeigt nur, dass Sie das Etikett zu reduzieren, indem 1 in jeder Schleife.
Ich könnte sagen, die Abbrechen-Schaltfläche zu ändern, das label null ist, und haben den run loop selector prüfen, ob der Wert null ist, aber könnte die RunLoop der eigenen Selektor sagen, es zu stoppen?
cancelPerformSelector:target:argument:
cancelPerformSelectorsWithTarget:
Diese sind die nächsten, die ich gefunden habe, aber Sie scheinen nicht zu arbeiten, aus dem inneren der RunLoops eigenen Selektor, oder zumindest nicht in irgendeiner Weise, die ich ausprobiert habe.
Grundsätzlich muss ich dem button sagen, die RunLoop zu stoppen oder irgendwie zu stoppen die RunLoop aus seinen eigenen Selektor.
Dank.
InformationsquelleAutor Elbimio | 2011-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht eine Schlinge, die Sie haben geplant einen timer zu beginnen, auf der main-Schleife laufen.
Was Sie tun sollten, ist, speichern Sie die
NSTimer
Objekt, das Sie erstellen, wie eine Instanz-variable vor der Planung der timer auf der run loop.In Ihrem
updateCountdownLabel:
Methode, wenn die Ende-Bedingung erfüllt einfach anrufen-invalidate
auf Ihre timer-Instanz. Dies wird entfernen Sie den timer aus der Schleife laufen, und weil Sie nie beibehalten können, wird es veröffentlicht.Habe ich aktualisiert, die Methoden zu verwenden, einen Selektor-basierte
NSTimer
anstatt IhreNSInvocation
-basiert. Dies bedeutet, dass die callback-Methode, die Signatur definiert ist, als Sie erwarten. Es vermeidet auch die Notwendigkeit zum speichern derNSTimer
Objekt in einem ivar:Ich habe aktualisiert die code-Selektor-basierte
NSTimer
, die Ihnen das gewünschte Ergebnis.Habe das problem gefunden. Ich brauchte nur eine variable zum speichern der Nummer auf dem Etikett als ein int, und verwenden Sie dann, DASS in der, wenn. Danke!
Dies funktioniert nur, wenn es feuert "updateCountdownLabel" das erste mal und Sie sofort und rufen invalidate auf den timer. Wenn es ausgelöst hat "updateCountdownLabel" mehrere Male und als die beschließt, erlischt die timer, als entweder es wird nicht entfernen Sie aus dem NSRunLoop oder NSRunLoop hat eine andere Eingangsquelle hinter der Szene.
InformationsquelleAutor Rob Keniger