cargando imágenes del disco en la aplicación de iPhone es lento

En mi aplicación de iPhone, estoy usando la camera del iPhone para tomar una foto y savela en el disco (la carpeta de documentos de la aplicación). Así es como lo guardo:

[UIImageJPEGRepresentation(photoTaken, 0.0) writeToFile:jpegPath atomically:YES]; 

Usando la mayor cantidad de compression, pensé que leer la image del disco sería rápido. ¡Pero no lo es! Utilizo la image como image de background de un button en una de mis vistas. Lo carga así:

 [self.frontButton setBackgroundImage:[UIImage imageWithContentsOfFile:frontPath] forState:UIControlStateNormal]; 

Cuando navego hacia la vista con este button, es lento y entrecortado. ¿Cómo puedo solucionar esto?

+imageWithContentsOfFile: es sincrónico, por lo que la interfaz de usuario de su subprocess principal está siendo bloqueada por la carga de la image desde la operación del disco y provoca el choppiness. La solución es utilizar un método que cargue el file de forma asíncrona desde el disco. También podría hacer esto en un hilo de background. Esto se puede hacer fácilmente envolviendo el +imageWithContentsOfFile: en dispatch_async() , luego un dispatch_async() nested en la queue principal que envuelve -setBackgroundImage: ya que los methods UIKit deben ejecutarse en el hilo principal. Si desea que la image aparezca inmediatamente después de que la vista se cargue, deberá precochejar la image del disco para que esté en la memory inmediatamente cuando aparezca la vista.

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ UIImage *image = [UIImage imageWithContentsOfFile:frontPath]; dispatch_async(dispatch_get_main_queue(), ^{ [self.frontButton setBackgroundImage:image forState:UIControlStateNormal]; }); }); 

Como un aparte, si la image del button tiene un gradiente, considere usar las siguientes properties para asegurarse de que el file de image cargado desde el disco sea pequeño:

 - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets 

o (en desuso, solo use si necesita admitir iOS 4.x):

 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight 

Esta es la forma más rápida que conozco. Necesitará importar #import <ImageIO/ImageIO.h>

Utilizo este código para download y comprimir imágenes durante un desplazamiento, dentro de una vista de desplazamiento y apenas notas el retraso.

 CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)mutableData, NULL); CFDictionaryRef options = (CFDictionaryRef)[[NSDictionary alloc] initWithObjectsAndKeys:(id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, (id)[NSNumber numberWithDouble:200.0], (id)kCGImageSourceThumbnailMaxPixelSize, nil]; CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); UIImage *image = [[UIImage alloc] initWithCGImage:thumbnail]; // Cache NSString *fileName = @"fileName.jpg"; NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"thumbnail"]; path = [path stringByAppendingPathComponent:fileName]; if ([UIImagePNGRepresentation(image) writeToFile:path atomically:YES]) { // Success }