Was entspricht Javas Thread.sleep () in Objective-C / Cocoa?

112

In Java können Sie die Ausführung des aktuellen Threads für eine bestimmte Zeit mit anhalten Thread.sleep(). Gibt es so etwas in Objective-C?

levi
quelle

Antworten:

160

Ja, es gibt + [NSThread sleepForTimeInterval:]

(Damit Sie für zukünftige Fragen wissen, ist Objective-C die Sprache selbst; die Objektbibliothek (mindestens eine davon) ist Cocoa.)

smorgan
quelle
6
Danke! <br> Für zukünftige Referenz ist die Definition tatsächlich + [NSThread sleepForTimeInterval:] (wird also wie [NSThread sleepForTimeInterval: 0.1] verwendet).
TinkerTank
Dies ist perfekt. Vielen Dank! Ich habe gerade meine Animationsblöcke fertiggestellt und es hat wie ein Zauber funktioniert.
RileyE
Wie wäre es mit Schlafen auf der Hauptstraße?
jerinho.com
1
Es ist das gleiche; Der Haupt-Thread ist nur ein Thread. Das Schlafen im Haupt-Thread ist normalerweise eine schlechte Idee, da Ihr Programm dadurch nicht mehr reagiert.
Smorgan
4
Für diejenigen, die sich fragen, ist [NSThread sleepForTimeInteval:] dasselbe wie [[NSThread currentThread] sleepForTimeInterval:].
Pnizzle
94

Eine Sekunde in Java schlafen :

Thread.sleep(1000);

Eine Sekunde schlafen in Ziel C:

[NSThread sleepForTimeInterval:1.0f];
Rok Strniša
quelle
40

Warum schläfst du? Wenn Sie in den Ruhezustand wechseln, blockieren Sie die Benutzeroberfläche und alle Hintergrund-URLs, die nicht in anderen Threads geladen werden (die Verwendung der asynchronen NSURL-Methoden funktioniert weiterhin für den aktuellen Thread).

Wahrscheinlich möchten Sie performSelector: withObject: AfterDelay. Dies ist eine Methode in NSObject, mit der Sie eine Methode in einem festgelegten Intervall später aufrufen können. Sie plant einen Aufruf, der zu einem späteren Zeitpunkt ausgeführt wird, aber alle anderen Dinge, die der Thread behandelt (wie Benutzeroberfläche und Datenladen) immer noch weitermachen.

Kendall Helmstetter Gelner
quelle
43
Schlafen ist für mich zu Testzwecken nützlich. Ich kann einige Netzwerkverzögerungen simulieren, um sicherzustellen, dass meine App richtig reagiert. Momentan teste ich gegen einen lokalen Webserver, daher ist alles im Wesentlichen augenblicklich.
Brantonb
6
Schlaf ist der falsche Weg, um Netzwerkverzögerungen zu testen. Sehen Sie sich die Antwort auf diese Frage an stackoverflow.com/questions/1502060/… an, um zu sehen, wie variable Geschwindigkeiten von Netzwerken im Simulator getestet werden. Da das Schlafen des Hauptthreads alles blockiert, simulieren Sie überhaupt keine Netzwerkverzögerung, sondern eher eine Unterbrechung der App.
Kendall Helmstetter Gelner
Das Ruhen ist nützlich, um zu simulieren, was bei einem Join-Vorgang in einem JAVA-Thread ausgeführt wird. Sie schlafen 10 Millis, prüfen, ob der Thread tot ist, und können ihn freigeben.
Mike S
1
Wenn Sie längere Zeit schlafen, befindet sich Ihr Thread genau in dem Zustand, in dem er vor dem Schlafengehen war. Es ist kein guter Test, da Ihre Bewerbung in der realen Welt bearbeitet wird und nicht schläft. Deshalb ist es wichtig herauszufinden, wie man testet, ohne sich auf den Schlaf zu verlassen.
Kendall Helmstetter Gelner
+1 Danke, dass Sie auf eine alternative Lösung hingewiesen haben! Genau das, wonach ich gesucht habe :)
jpswain
7

Natürlich können Sie auch die Standardaufrufe für Unix sleep () und usleep () verwenden. (Wenn ich Cocoa schreibe, bleibe ich jedoch beim [NSThread sleepForTimeInterval:].)

Bill Heyman
quelle
5

Wenn Sie NSThread sleepForTimeInterval (kommentierter Code) zum Ruhezustand verwenden, wird das Abrufen von Daten blockiert, aber + [NSThread sleepForTimeInterval:] (checkLoad-Methode) blockiert das Abrufen von Daten nicht.

Mein Beispielcode wie folgt:

- (void)viewDidAppear:(BOOL)animated
{
//....
//show loader view
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON data"];
//    while (_loans == nil || _loans.count == 0)
//    {
//        [NSThread sleepForTimeInterval:1.0f];
//        [self reloadLoansFormApi];
//        NSLog(@"sleep ");
//    }
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
}

-(void) checkLoad
{
    [self reloadLoansFormApi];
    if (_loans == nil || _loans.count == 0)
    {
        [self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
    } else
    {
        NSLog(@"size %d", _loans.count);
        [self.tableView reloadData];
        //hide the loader view
        [HUD hideUIBlockingIndicator];
    }
}
wu liang
quelle
0

usleep () kann auch verwendet werden, um den aktuellen Thread zeitweise anzuhalten

j2emanue
quelle