2010-02-21 16 views
5

Estoy tratando de mejorar el rendimiento de desplazamiento en un UITableView que utiliza celdas con imágenes recuperadas de la web, pero almacenadas en el NSCachesDirectory. Las celdas tienen una vista de contenido personalizada para dibujar los contenidos (una imagen).¿Usa la memoria caché del sistema de UIImage objetos con imágenes cargadas de la memoria caché de disco (NSCachesDirectory)?

Cuando uso una imagen de marcador de posición del paquete de aplicaciones, usando [UIImage imageNamed:@"Placeholder.png"], el rendimiento del desplazamiento es muy rápido.

Cuando cargo una imagen de la memoria caché de disco (NSCachesDirectory) usando [UIImage imageWithContentsOfFile:cachePath], el rendimiento del desplazamiento empeora.

Según la documentación, imageNamed: almacena en caché la imagen y imageWithContentsOfFile: no.

Cómo utilizar la memoria caché del sistema UIImage al usar imageWithContentsOfFile:?

¡Muchas gracias!

+0

Es posible que desee una [pregunta reciente] (http://stackoverflow.com/questions/18750686/how-to-find-uiimage-bottleneck#comment27641913_18750686) mía donde resolví el problema almacenando una imagen sin comprimir . –

Respuesta

8

Parece posible utilizar la ruta a una imagen en el NSCachesDirectory como argumento para el método [UIImage imageNamed:]. El método acepta rutas relativas (relativas al paquete de aplicaciones), p. Ej .: @"../Library/Caches/SomeCachedImage.png" funciona.

UIImage guarda en caché automáticamente la imagen en la memoria si se usa varias veces, lo que mejora el rendimiento cuando una imagen se usa varias veces en una vista de tabla.

+0

Para mí, este método [UIImage imageNamed:] no puede cargar la imagen que doy en una ruta específica, siempre devuelve nil – vodkhang

+0

funciona para mí. Lo intentaré con NSPicturesDirectory, ¡vale la pena! –

0

No puede. imageWithContentsOfFile: siempre cargará la imagen del archivo (aunque de forma perezosa). Lo que puede hacer es crear un caché en su memoria propia con NSArrays o NSDictionaries, dependiendo de cómo desee realizar la búsqueda.

3

Es probable que el problema sea que está cargando y descomprimiendo la imagen en el ciclo de ejecución principal. Esto bloqueará la interfaz de usuario por un corto tiempo. Obtendrá un rendimiento mucho mejor si realiza la carga y la descompresión en un subproceso separado y solo establece la imagen en el bucle principal. (Lo cual también es necesario para los cambios en la interfaz de usuario, que establecer una imagen en un UIImageView es)

Esto requerirá un poco más de infraestructura. Como por ejemplo un esquema de notificación o una observación de valor clave.

+0

Sí, ese es exactamente el problema. Esperaba una solución lista para usar. Pero supongo que no está allí. Gracias por la respuesta. –

+0

Si te gusta la respuesta, debes votarla o marcarla como resuelta. –

+0

UIImage descomprime perezosamente los datos del mapa de imagen, por lo que en muchas (¿la mayoría?) Esto no ayudará realmente; la carga desde el disco ocurrirá en el hilo de fondo, pero la descompresión (que a menudo lleva más tiempo que cargar los datos) ocurrirá cuando establecer la imagen, que tiene que suceder en el hilo principal. –

Cuestiones relacionadas