iphone - para - ¿Cómo actualizar una etiqueta periódicamente en iOS(cada segundo)?
ios 12 (3)
Esta pregunta ya tiene una respuesta aquí:
- NSTimer no dispara cuando runloop está bloqueado 2 respuestas
Uso un NSTimer que se dispara cada segundo y actualiza una etiqueta que muestra el tiempo restante hasta un evento.
Yo trabajo bien hasta ahora. El problema es que mientras estoy desplazando el TableView, mi etiqueta no se actualiza, porque MainThread está bloqueado por el evento touch / scroll.
Pensé en crear un segundo hilo para el temporizador, pero no pude actualizar la etiqueta de un hilo de fondo de todos modos. Tuve que ponerla en cola con performSelector ... en MainThread, donde quedaría como antes.
¿Hay alguna forma de actualizar la etiqueta mientras se desplaza?
El problema es que no se llamará a un Timer programado mientras el hilo principal esté rastreando toques. Es necesario programar el temporizador en el bucle de ejecución principal.
Entonces, en lugar de hacer
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
utilizar
NSTimer* timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
También puedes usar GCD. Asi que corre
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
});
y ahora en tu método updateLabel
- (void) updateLabel:(id) sender {
NSString *text = @"some text";
dispatch_sync(dispatch_get_main_queue(), ^{
label.text = text;
});
}
Esto actualizará la etiqueta en el hilo principal.
prueba esto:
self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateClock) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];