ios - hacer - photo grid video
Logre un desplazamiento suave para Photo Grid con miles de imágenes desde el disco (2)
Tengo un PhotoGrid
con tres fotos en cada fila, implementado con UITableView
.
Tengo una memoria caché en la memoria (usando NSCache) que tiene una capacidad para 100 imágenes, por lo que en algún momento tendré al menos 100 imágenes en la memoria a pesar de que tengo miles de imágenes en el disco para mostrar en la Grid.
Todas mis imágenes son 4KB-20KB JPEG.
Entonces, con esta infraestructura, las imágenes se cargan y descargan continuamente de NSCache cuando el usuario se desplaza por la cuadrícula de fotografías. Con el desplazamiento normal todo se ve bien, obtengo alrededor de 55-58 fps.
Cuando el usuario comienza a desplazarse más rápido de un lado a otro, tengo dos casos:
Si se separa la tarea de carga de imágenes del hilo principal, termino perdiendo imágenes en la cuadrícula de fotos, porque mis celdas se muestran antes de que las imágenes se lean en la memoria.
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImage *image = getImageFromCacheForImagePath:imagePath; dispatch_async(dispatch_get_main_queue(), ^{ cell.leftGridItem.imageView.image = image; }); }); }
Si tengo la tarea de carga de imágenes en el hilo principal, hay un tartamudeo. Obtengo alrededor de 36-45 fps.
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = getImageFromCacheForImagePath:imagePath; cell.leftGridItem.imageView.image = image; }
getImageFromCacheForImagePath:imagePath
obtiene la imagen inmediatamente de NSCache, si no, la imagen se carga desde el archivo y se configura en NSCache para su uso posterior, pero establezco el límite de NSCache
en 100.
Cosas que intenté / pellizqué:
- Evite
clipsToBounds
para vistas de imágenes de cuadrícula. - Cargando imágenes en el hilo de fondo.
- Uso de
NSOperation
Queues. - Cargando imágenes en lotes de 100 (funciona, pero con el desplazamiento rápido, el tiempo de carga de la imagen se retrasó).
Estoy tratando de lograr la misma sensación que la aplicación de fotos nativa.
Tus sugerencias son apreciadas.
También me enfrenté al mismo problema hace unos días, por lo que GitHub es el mejor lugar para buscar soluciones de código abierto, así que prueba estos enlaces.
Verifique PF-GridView o DTGridView .
También eche un vistazo a AQGridView , Cómo escribir un selector de imágenes personalizado como UIImagePicker ,
Solo necesitamos hacer una manupulación de bits de acuerdo a nuestras necesidades y funciona como un campeón.
Implementé una tabla de desplazamiento suave con más de 700 imágenes. La clave no era solo cargar imágenes en segundo plano sino también cambiar su tamaño en segundo plano para que se adaptaran perfectamente al contenedor. Al parecer, el cambio de tamaño es una operación demasiado pesada para hacerlo en el hilo de la interfaz de usuario.