2009-06-29 10 views
3

Ich frage mich, ob jemand eine Klasse in objective-C kennt, die die Anwendung zu einer bestimmten Zeit während der Laufzeit stoppt/verzögert? Ich habe mir den Time Manager und den NSTimer bereits angeschaut und sehe nicht, wie ich da eine Verzögerung einbringen könnte. Ich habe diese beiden Klassen vorher noch nie benutzt, also hat vielleicht jemand anderes mir einen Tipp geben können? Vielen Dank!Objective-C-Klasse Zeitverzögerung?

+0

Warum möchten Sie, dass Ihre Anwendung für eine bestimmte Zeit einfriert? Oder möchten Sie etwas weniger als die gesamte App, UI und alles verzögern? – user57368

+0

Ich möchte nur, dass der Runloop, auf dem meine Anwendung ausgeführt wird, um einige Sekunden verzögert wird. Das Problem ist, dass meine App irgendwo in der Schleife hängen bleibt und ich ein Label in meiner GUI und labelStatus.text = @ "someText" verwende, damit ich genau feststellen kann, wo der Hang ist. –

+0

Ich denke, das bedeutet, dass ich meine ganze Anwendung für ein paar Sekunden einfrieren lassen möchte, so dass keine Hintergrund-Threads im Runloop noch laufen, denn das ist wahrscheinlich das, was das Problem an erster Stelle verursacht. –

Antwort

4

Es hängt wirklich davon ab, was Sie mit "stoppt/verzögert die App." Wenn Sie eine Single-Thread-App haben, können Sie einfach jeden der verschiedenen Schlafanrufe verwenden (usleep, sleep, nanoschlaf usw.). Das ist aber wahrscheinlich nicht das, was Sie wollen, denn es wird nur zu einer blockierten Benutzeroberfläche für den Benutzer führen und keine Hintergrundthreads stoppen.

Um wirklich eine anständige Antwort zu geben, ist es wahrscheinlich notwendig zu wissen, was Sie tatsächlich versuchen zu tun. Warten Sie auf etwas, rufen Sie eine Ressource auf usw.?

+0

Nun, tatsächlich läuft meine Anwendung auf einem Runloop und es bleibt an einem bestimmten Punkt stecken (was ich im Moment nicht weiß). Ich habe ein Label in meine GUI gelegt, damit ich die Runloop meiner App direkt nach einem Label verzögern kann. Text = "Application Running Until Here". Ich dachte, dies wäre der effizienteste Weg, um genau zu sehen, wo meine App hängt. –

+0

Sie meinen ein UILabel? Ich denke nicht, dass das tun wird, was Sie wollen. Die gesamte Bildschirmzeichnung wird verzögert, bis der Runloop ausgeführt wird, also "label.text = @" Anwendung, die hier ausgeführt wird "; sleep (3);" wird nach dem Festlegen des Textwerts für die Etiketten, jedoch vor dem Aktualisieren des Bildschirms, 3 Sekunden lang angehalten. Wenn Ihr Runloop aus einem anderen Grund staut, wird das Label nie auf dem Bildschirm aktualisiert, obwohl Sie den Textwert festgelegt haben. Wenn Sie die tatsächlichen Zeitstempel verwenden möchten, verwenden Sie eine der Debug-Anwendungen oder NSLog zur Konsole. –

+0

Nun, ich stimme Ihnen mit dem NSLog-Debugging zu. Wie genau würden Sie das tun, wenn Sie eine Anwendung ausführen (ich weiß, NSLog @ "someText") Ich habe versucht, es zuvor in meiner Anwendung zu implementieren, und wenn ich es auf dem Simulator ausführen, nichts wird jemals in der Terminal. Das Problem, mit dem ich wahrscheinlich konfrontiert werde, ist, dass ich einen Runloop ähnlich dem in GKTank implementiert habe, der die P2P-Bluetooth-Konnektivität des iPod Touch/iPhone nutzt und der Simulator dies derzeit nicht unterstützt. Auf welche Weise würden Sie mir vorschlagen, dieses Problem anzugehen? –

2

Ich denke, Sie suchen [NSThread sleepForTimeInterval:] Das sollte den Trick tun. Sie sollten auch einen Timer verwenden, um nach einer Verzögerung eine andere Funktion aufzurufen, da diese Lösung nicht blockiert. Der NSThread-Ansatz wird Ihre Anwendung vollständig für das Zeitintervall sperren, wenn Sie sie aus dem Hauptthread aufrufen.

+1

Es wird die Benutzeroberfläche sperren, es wird keine Hintergrund-Threads sperren, die möglicherweise Sachen tun, einschließlich Framework-Threads wie der http-Loader. –

4
#include <unistd.h> 
sleep(3); // or usleep(3000000); 
Verwandte Themen