Llamar a dormir (5); y actualizar el campo de texto no funciona

textLabel dormir un método (ver más abajo), pero en lugar del textLabel cambiar del valor de myTextLabelString , esperar 5 segundos, cambiar a “sleep 5 worked”, esperar 5 segundos y finalmente cambiar a “sleep 5” funcionó por segunda vez round “… simplemente va desde el valor de myTextLabelString , espera 10 segundos y luego cambia a” sleep 5 myTextLabelString second time round “.

 - (void)textLabelChanger:(id)sender { NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown]; textLabel.text=myTextLabelString; sleep(5); textLabel.text=@"sleep 5 worked"; sleep(5); textLabel.text=@"sleep 5 worked second time round"; return; } 

Esto probablemente proporcionará el resultado que busca:

 -(void)textLabelChanger:(id)sender { NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown]; textLabel.text=myTextLabelString; [self performSelector:@selector(updateTextLabelWithString:) withObject:@"sleep 5 worked" afterDelay:5.0]; [self performSelector:@selector(updateTextLabelWithString:) withObject:@"sleep 5 worked second time round" afterDelay:10.0]; } -(void)updateTextLabelWithString:(NSString*)theString { textLabel.text=theString; } 

Hay muchas maneras de hacer esto. En lugar de tener una única updateTextLabelWithString que llama dos veces con demoras diferentes, puede tener un doFirstTextUpdate que escriba “sleep 5 worked” y luego llama a otro selector como doSecondTextUpdate utilizando la misma técnica [self performSelector:] después de otro retraso de 5 segundos.

Es extremadamente raro que necesites usar el método sleep() con Objective-C.

 -(void)textLabelChanger:(id)sender { NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown]; textLabel.text=myTextLabelString; [self performSelector:@selector(firstUpdate) withObject:nil afterDelay:5.0]; } -(void)firstUpdate { textLabel.text = @"sleep 5 worked"; [self performSelector:@selector(secondUpdate) withObject:nil afterDelay:5.0]; } -(void)secondUpdate { textLabel.text = @"sleep 5 worked second time round"; } 

Los cambios en los componentes de UIKit por lo general no tienen efecto hasta que vuelves a abandonar el runloop. Como nunca bloqueas intencionalmente el hilo principal (y, supongo, tu código es solo una prueba de sueño en lugar de algo que realmente quisieras hacer), eso normalmente no es un problema.

Pruebe NSLog en lugar de configurar la propiedad ‘texto’ si realmente desea verificar que el sueño funciona (todos los registros tienen una marca de tiempo), use performSelector: afterDelay: si desea que ocurra algo en el hilo principal después de una pausa.

Este es un problema clásico con prácticamente todos los kits de herramientas de progtwigción GUI. Si duerme en el hilo de manejo de eventos, ese hilo está atado y no puede actualizar la pantalla. Si necesita realizar un trabajo continuo que actualice periódicamente la pantalla, debe hacerlo en un hilo separado; eso es lo que debes hacer aquí.

Como ya se mencionó, bloquear el hilo principal probablemente no sea lo que quieres hacer. En lugar de intentar que tu aplicación deje de hacer nada, incluido redibujar la pantalla o responder a toques, durante 5 segundos piensa en el problema desde un ángulo diferente. Crea un NSTimer para progtwigr una llamada a un método 5 segundos en el futuro y deja que tu aplicación siga funcionando mientras esperas a que se active ese temporizador.