La carga de una imagen suele ser lenta, y en general considero recomendable realizarlo de manera asíncrona. Así el proceso de cargar la imagen desde disco, interpretarla, redimensionarla se pueden realizar sin interferir en el hilo de atención a las acciones del usuario.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let id = thought.valueForKey("id") as! String | |
if let cachedImage = ImageCache.sharedCache.imageForKey("image-\(id)") { | |
cell.picture.image = cachedImage | |
} else { | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { | |
let scaledImage = Helper.scaleUIImageToSize(image!, size: size) | |
ImageCache.sharedCache.setImage(scaledImage, forKey: "image-\(id)") | |
dispatch_async(dispatch_get_main_queue(), { | |
cell.picture.image = scaledImage | |
}) | |
}) | |
} |
El mecanismo utilizado es una clase que tiene un diccionario (arreglo asociativo) en memoria e identifica a las imágenes con un key.
El nombre del key debe trabajarse de acuerdo a sí tendremos distintas dimensiones de imágenes en el mismo caché, o si deseamos poder controlar caching para otros elementos. Seguramente podemos utilizar también un library (ej. Haneke).
Aunque esta implementación es simple, sencilla y suficiente para muchos casos.
La fuente de este método es un artículo de Ray Wenderlich acerca de la utilización de Instruments. Y, pues, al verificar el consumo de tiempo de procesador, resalta el trabajo por hacer un Resize de las fotos. Esta tarea desaparece cuando se cuenta con las fotos ya redimensionadas en el caché.
https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started