ios - tipos - ventajas de objective c
Cómo esperar en Objective-C y Swift (7)
Quiero cambiar el UILabel
mi UILabel
después de 2 segundos.
Intenté configurar el UILabel
mi UILabel
en "Un texto" , y uso el modo de sleep(2)
y, finalmente, cambiar el texto a "Otro texto" .
Pero el modo de sleep(2)
solo congela la aplicación y se configura "Otro texto" sin mostrar "Texto A" durante 2 segundos.
¿Cómo puedo mostrar "Un texto" durante 2 segundos y luego mostrar "Otro texto" ?
Esto se debe a que la vista no se actualiza hasta el final del runloop. En lugar de usar el modo de espera, intente usar NSTimer para establecer un tiempo específico para actualizar la vista.
Grand Central Dispatch tiene una función auxiliar dispatch_after()
para realizar operaciones después de un retraso que puede ser muy útil. Puede especificar el tiempo de espera antes de la ejecución y la instancia de dispatch_queue_t
para ejecutar. Puede usar dispatch_get_main_queue()
para ejecutar en el hilo principal (UI).
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// do something
});
En Swift 3 , el ejemplo anterior se puede escribir como:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// do something
}
Necesitas usar un temporizador. Usar el sueño detendrá todo tu programa. Compruebe NSTimer
Puede lograr esto con un temporizador, por ejemplo
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:4.0 target:self selector:@selector(eventToFire:) userInfo:nil repeats:YES]; // Fire every 4 seconds.
...
- (void)eventToFire:(NSTimer*)timer {
// Do Something
}
Puedes usar
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
o si desea mostrarlo periódicamente, verifique la clase NSTimer
.
Puedes usar NSTimer
, así -
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(updateLabel:)
userInfo:nil
repeats:YES];
Defina otro método updateLabel
y haga la actualización allí. Defina su intervalo de tiempo para satisfacer sus necesidades ...
El ajuste de repeats
en YES
garantiza que este selector se ejecute cada 0,5 segundos (en el caso anterior).
Sé que llego tarde a esta fiesta. Pero encontré que la gente no ha mencionado el sueño de hilo. Si está utilizando GCD para llamar a esa función. Puedes usar :
[NSThread sleepForTimeInterval:2.0f];
Para retrasar el hilo durante 2 segundos.
[self changeText: @"A text"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Here your non-main thread.
[NSThread sleepForTimeInterval:2.0f];
dispatch_async(dispatch_get_main_queue(), ^{
//Here you returns to main thread.
[self changeText: @"Another text"];
});
});
Edición 2 (febrero de 2015):
Creo que el NSTimer es una gran solución. Mi solución acaba de dar otra opción para lograr el objetivo de NSTimer.
Por favor, lea: ¿Cómo uso NSTimer?
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(doSomethingWhenTimeIsUp:)
userInfo:nil
repeats:NO];
En la clase, necesitas este método:
- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {
// YES! Do something here!!
}
Edición 3 (mayo 2016):
En Swift 2.0, puedes usar de esta manera:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: "doSomethingWhenTimeIsUp:",
userInfo: nil,
repeats: false)
Crea una entidad NSTimer y agrega el temporizador automáticamente al NSRunLoop asociado con el NSThread en el que se crea el temporizador.
Edición 4 (junio 2016):
En Swift 2.2, la forma de invocar a la selección es:
#selector(doSomethingWhenTimeIsUp(_:))
Entonces, es algo como:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: #selector(doSomethingWhenTimeIsUp()),
userInfo: nil,
repeats: false)
Edición 5 (octubre 2016):
En Swift 3, la forma de invocar select es:
#selector(doSomethingWhenTimeIsUp)
Entonces, es algo como:
Timer.scheduledTimer(timeInterval: 2.0,
target: self,
selector:#selector(doSomethingWhenTimeIsUp),
userInfo: nil,
repeats: false)
Entonces, la función debería verse así:
@objc private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
Edición 6 (mayo 2018):
En Swift 4 , podemos hacerlo de la siguiente manera.
let delaySeconds = 2.0
DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
doSomethingWhenTimeIsUp()
}
Entonces, la función debería verse así:
private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}