¿Cuál es el equivalente de Thread.sleep () de Java en Objective-C / Cocoa?

112

En Java, puede suspender la ejecución del hilo actual durante un período de tiempo usando Thread.sleep(). ¿Hay algo como esto en Objective-C?

Levi
fuente

Respuestas:

160

Sí, hay + [NSThread sleepForTimeInterval:]

(Solo para que sepas para futuras preguntas, Objective-C es el lenguaje en sí; la biblioteca de objetos (uno de ellos al menos) es Cocoa).

smorgan
fuente
6
Thnx! <br> para referencia futura, la definición es en realidad + [NSThread sleepForTimeInterval:] (entonces, usado como [NSThread sleepForTimeInterval: 0.1]).
TinkerTank
Esto es perfecto. ¡Gracias! Acabo de terminar mis bloques de animación y funcionó como un encanto.
RileyE
¿Qué tal dormir en el therad principal?
jerinho.com
1
Es lo mismo; el hilo principal es solo un hilo. Sin embargo, dormir en el hilo principal suele ser una mala idea, ya que hace que su programa no responda.
smorgan
4
para aquellos que se preguntan, [NSThread sleepForTimeInteval:] es lo mismo que [[NSThread currentThread] sleepForTimeInterval:].
pnizzle
94

Dormir un segundo en Java:

Thread.sleep(1000);

Dormir un segundo en el objetivo C:

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

¿Por qué estás durmiendo? Cuando duerme, está bloqueando la interfaz de usuario y también cualquier URL de fondo que no se cargue en otros subprocesos (el uso de los métodos asíncronos de NSURL aún funciona en el subproceso actual).

Lo más probable es que lo que realmente desee sea performSelector: withObject: AfterDelay. Ese es un método en NSObject que puede usar para llamar a un método en un intervalo predeterminado más tarde: programa una llamada que se realizará en un momento posterior, pero todas las otras cosas que maneja el hilo (como la interfaz de usuario y las cargas de datos) todavía continúa.

Kendall Helmstetter Gelner
fuente
43
Dormir me resulta útil para realizar pruebas. Puedo simular algunos retrasos en la red para asegurarme de que mi aplicación responde correctamente. Actualmente estoy probando contra un servidor web local, por lo que todo es esencialmente instantáneo.
brantonb
6
El sueño es la forma incorrecta de probar los retrasos de la red. Mire la respuesta a esta pregunta stackoverflow.com/questions/1502060/… para ver cómo probar velocidades variables de redes en el simulador. Debido a que dormir el hilo principal bloquea todo, no está simulando un retraso de red en absoluto, sino más bien una suspensión de la aplicación.
Kendall Helmstetter Gelner
Dormir es útil para simular lo que se hace en una operación de unión en un hilo JAVA. Duermes 10 milis, comprueba si el hilo está muerto y luego puedes deslocalizarlo.
Mike S
1
Si duerme durante un período de tiempo, su hilo estará exactamente en el mismo estado en el que estaba antes de dormir. No es una buena prueba porque en el mundo real su aplicación estará procesando, no durmiendo. Por eso es importante descubrir cómo realizar la prueba sin depender del sueño.
Kendall Helmstetter Gelner
+1 ¡Gracias por señalar una solución alternativa! Justo lo que estaba buscando :)
jpswain
7

Por supuesto, también puede usar las llamadas estándar sleep () y usleep () de Unix. (Sin embargo, si escribo Cocoa, me quedaría con [NSThread sleepForTimeInterval:]).

Bill Heyman
fuente
5

Si usa NSThread sleepForTimeInterval (código comentado) para dormir, la recuperación de datos se bloqueará, pero + [NSThread sleepForTimeInterval:] (método checkLoad) no bloqueará la recuperación de datos.

Mi código de ejemplo de la siguiente manera:

- (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
fuente
0

usleep () también se puede usar ya que lo he usado para pausar el hilo actual a veces

j2emanue
fuente