2011-08-14 16 views
6

Tengo un UIScrollView que tiene una serie de etiquetas que actualizan rápidamente los números (cada 0,06 segundos). Sin embargo, mientras la vista de desplazamiento se mueve, el NSTimer está en pausa y no continúa hasta que el desplazamiento y la animación elástica hayan finalizado.UIScrollView pausa NSTimer mientras se desplaza

¿Cómo puedo evitar esto y ejecutar NSTimer independientemente del estado de la vista de desplazamiento?

Respuesta

22

Una manera fácil de arreglar esto es agregando su NSTimer al mainRunLoop.

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Para eliminar un temporizador de todos los modos de bucle de ejecución en el que está instalado, envía un mensaje de invalidate al temporizador.

+0

Así que con esto en realidad no tienen para disparar el temporizador, se inicia cuando se ejecuta esa línea, ¿correcto? –

+0

De la documentación: "Puede agregar un temporizador a múltiples modos de entrada. Mientras se ejecuta en el modo designado, el receptor activa el temporizador o después de su fecha de disparo programada. Al dispararse, el temporizador invoca su rutina de controlador asociada, que es un selector en un objeto designado ". –

0

(Swift) Una alternativa: Se puede utilizar un sistema de temporizador basado en GCD como éste:

class GCDTimer { 

    private var _timer : dispatch_source_t? 

    init() { 

    } 

    private func _createTheTimer(interval : Double, queue : dispatch_queue_t, block : (() -> Void)) -> dispatch_source_t 
    { 
     let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
     if (timer != nil) 
     { 
      dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC))), UInt64(interval * Double(NSEC_PER_SEC)), (1 * NSEC_PER_SEC)/10); 
      dispatch_source_set_event_handler(timer, block); 
      dispatch_resume(timer); 
     } 
     return timer; 
    } 


    func start(interval : Double, block : (() -> Void)) 
    { 
     let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

     _timer = _createTheTimer(interval, queue: queue, block: block) 

    } 

    func stop() 
    { 
     if (_timer != nil) { 
      dispatch_source_cancel(_timer!); 
      _timer = nil; 
     } 
    } 
} 
+0

Así es como usted lo utilizaría: 'myInterval var: GCDTimer = GCDTimer() myInterval.start (1.0) { println ("lol") }' – Thyselius

+0

Si desea realizar una actualización de un elemento de interfaz de usuario mediante este temporizador, se debe hacer esto en el hilo principal, por ejemplo: 'dispatch_async (dispatch_get_main_queue(), { \t \t \t \t \t \t self.myUIImageView.image = UIImage (datos:!! datos como NSData) \t \t \t \t \t}) ' – Thyselius

+0

¡me alegra que lo haya encontrado útil! – raf

1

para SWIFT:

NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
Cuestiones relacionadas