¿Cómo hacer que ui sea receptivo todo el tiempo y actualizar el fondo?

Estoy creando una aplicación que muestra 8 miniaturas por página y puede tener n páginas. Cada una de estas miniaturas son UIViews y se agregan a UIScrollView. Sin embargo, he implementado Paging usando el código de muestra de Apple.

El problema:

  1. Cada miniatura (UIView) tarda 150 milisegundos en crearse y agregarse a la vista de desplazamiento
  2. Por lo tanto, para 3 páginas, se necesita mucho tiempo para crearse y agregarse a la vista de desplazamiento de la interfaz de usuario.
  3. En este punto, la vista de desplazamiento no es muy respsoniva y es muy desigual y da una mala experiencia de usuario
  4. ¿Cómo puedo crear las miniaturas y agregarlas a UIScrollview sin afectar la capacidad de respuesta táctil? Quiero que se ejecuten independientemente del hilo principal que es responsable de manejar los eventos táctiles (supongo).

También me gustaría mencionar que cuando se crea una miniatura, disparo una descarga Async de la imagen y se invoca el método de delegado cuando se completa la descarga.

Déjame saber las opciones que tengo para hacer que esto sea más receptivo y actualizar la interfaz de usuario sin afectar las operaciones táctiles. El control de página funciona bien con la carga lenta de la cuadrícula de miniaturas.

TIA,

Praveen S

Grand Central Dispatch es fácil de usar para la carga de fondo. Pero GCD es solo para después de iOS4. Si tiene que admitir iOS3, performSelectorInBackground / performSelectorOnMainThread o NSOperationQueue son útiles.

Y tenga cuidado, casi las clases de UIKit no son seguras para subprocesos, excepto para dibujar en un contexto de gráficos. Por ejemplo, UIScrollView no es seguro para subprocesos, UIImage imageNamed: no es seguro para subprocesos, pero UIImage imageWithContentsOfFile: es seguro para subprocesos.

dispatch_queue_t mainQueue = dispatch_get_main_queue(); dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(concurrentQueue, ^{ dispatch_apply([thumbnails count], concurrentQueue, ^(size_t index) { Thumbnail *thumbnail = [thumbnails objectAtIndex:index]; thumbnail.image = [UIImage imageWithContentsOfFile:thumbnail.url]; dispatch_sync(mainQueue, ^{ /* update UIScrollView using thumbnail. It is safe because this block is on main thread. */ }); } /* dispatch_apply waits until all blocks are done */ dispatch_async(mainQueue, ^{ /* do for all done. */ }); } 

Estaba teniendo un problema similar.
Lo que hice fue en una instancia que guardé solo 3 páginas en la memoria y borré todas las restantes.
Si supone que hay 3 pantallas s1, s2, s3. Y el usuario está viendo s2. Cada vez que se desplaza a s3, eliminaré s1 y cargaré una nueva página s4.
Para que los usuarios tengan una mejor experiencia. Y menos memoria estará ocupada.

Ya sea que esté utilizando una subvista o un ViewController por separado para cada “página” o elemento de la vista de desplazamiento, la inestabilidad o el bajo rendimiento pueden ser ayudados al cambiar la ubicación de su código.

Específicamente, el código de muestra de apple para una vista de desplazamiento con pagecontrol tiene algo como esto:

 [self loadScrollViewWithPage:page - 1]; [self loadScrollViewWithPage:page]; [self loadScrollViewWithPage:page + 1]; 

Sin embargo, ese código aparece en su muestra en el método “scrollViewDidScroll”. Está intentando hacer varios levantamientos pesados ​​al desplazarse y cargar al mismo tiempo. Incluso si tus imágenes son locales, esto es desagradable.

Si mueve este y el código relacionado, incluyendo una referencia a la página actual a “scrollViewDidEndDecelerating”, la inestabilidad de la interfaz se resuelve porque la carga ocurre mientras la vista de desplazamiento ya no se mueve.