2010-11-20 12 views
5

El seguimiento de eventos en UIScrollview bloquea el hilo principal. Estoy usando el hilo principal para ejecutar un temporizador que impulsa algunas animaciones, el resultado es que cualquier interacción del usuario con la vista desplazable (arrastrándolo hacia arriba o hacia abajo, etc.) hace que la animación (ejecutándose en el runloop principal) se congele. ¿Hay alguna forma de evitar esto?El seguimiento de eventos en UIScrollView bloquea el hilo principal. ¿Alguna solución?

He intentado con RTFM sobre NSRunloop (CFRunLoopAddCommonMode y otros), pero es bastante escueto, lo que me lleva a pensar que es mejor evitar retocar las prioridades del evento/las prioridades del subproceso. Alguien tiene alguna idea?

+1

Solo puede hacer cosas de UI en el hilo principal, por lo que no se aplicaría el problema con las prioridades de hilo. Tengo curiosidad: ¿sabes si los NSTimers dejan de disparar o los disparos de los temporizadores, pero se niegan a aplicar los cambios que realizas en la animación? ¿La animación está * * en UIScrollView, o * dentro * de la vista de desplazamiento? es decir, ¿está tratando de animar y cambiar lo mismo que el scrollview scrolling está tratando de cambiar? (Scroll view rects, etc.)? – Brad

+0

Gracias, Brad: lo que esperaba (probablemente peligrosamente) era agregar el modo EventTracking al runloop principal, lo que le permitía continuar ejecutándose al mismo tiempo que el runloop de EventTracking. La animación que se está bloqueando se está haciendo realmente en una vista completamente diferente a la que contiene la vista de desplazamiento. Para responder a su otra pregunta, el NSTimer deja de disparar por completo. Parece completamente bloqueado por el negocio de mayor prioridad de rastrear los eventos del usuario en el UIScrollView (no relacionado). –

Respuesta

16

En lugar de utilizar una de constructores estáticos de NSTimer, crear el objeto de temporizador y programar de forma manual como esto:

NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:delayInSeconds] interval:0 target:yourObject selector:yourSelector userInfo:nil repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
[timer release]; 

Sus parametros a initWithFireDate: será muy diferente, por supuesto, sobre todo porque parece que usted' re usando un temporizador de repetición. Creo que puedes ver la idea básica sin embargo.

Cuando está desplazándose, el ciclo de ejecución entra en un modo que impide la ejecución de las tareas del "modo predeterminado". El NSTimer estático funciona todo en el modo predeterminado, por lo que no se dispara mientras se desplaza. La programación manual del temporizador le permite especificar el modo y NSRunLoopCommonModes incluye el modo de ejecución utilizado al desplazarse.

+0

Brillante! He estado usando: \t [[NSRunLoop mainRunLoop] addTimer: loopTimer forMode: [NSRunLoop currentMode]]; que todavía estaba bloqueado. Tu solución funciona perfectamente. –

+0

¡Gracias un trillón! Esta solución aumenta drásticamente la capacidad de uso de mi tabla de carga diferida. – Nailer

0

Una idea es hacer que el temporizador se ejecute en una secuencia separada. Cuando el temporizador se dispara, entonces tiene lo que tiene que hacer ejecutarse en el hilo principal.

Editar:

Ah sí, lo había olvidado por completo de cómo UIScrollView bloquea prácticamente todo. Otra idea (aunque muy fea) es comprobar si el temporizador se disparó durante los métodos de delegado (es decir, -scrollviewDidScroll, etc.) de UIScrollView. Es una especie de truco, pero básicamente es la única forma que conozco para ejecutar cualquier código durante el desplazamiento.

+0

Gracias, sí, en realidad ya estoy ejecutando mi temporizador de animación en el hilo principal. Parece que el seguimiento entre bastidores de los eventos del usuario tiene una prioridad mayor que el hilo principal, por lo que cuando ocurre algo continuo (como desplazamiento), bloquea el hilo principal durante mucho tiempo ... –

+0

@Andy Milburn: Vea editar para otra idea. –

Cuestiones relacionadas