¿Cómo acelerar el almacenamiento de una image de UIImagePickerController desde la camera al sistema de files a través de UIImagePNGRepresentation ()?

Estoy haciendo una aplicación que permite a los usuarios tomar una foto y mostrarlos en miniatura y visor de fotos. Tengo la class NSManagedObject llamada foto y la foto tiene un método que toma UIImage y lo convierte a PNG usando UIImagePNGRepresentation () y lo guarda en el sistema de files. Después de esta operación, cambie el tamaño de la image al tamaño de la miniatura y guárdela.

El problema aquí es UIImagePNGRepresentation () y la conversión del tamaño de la image parece ser muy lenta y no sé si esta es una forma correcta de hacerlo.

Dime si alguien sabe cuál es la mejor manera de lograr lo que quiero hacer.

Gracias de antemano.

Dependiendo de la resolución de la image, UIImagePNGRepresentation puede ser muy lenta, al igual que cualquier escritura en el sistema de files.

Siempre debe ejecutar este tipo de operaciones en una queue asíncrona. Incluso si el performance parece ser lo suficientemente bueno para su aplicación cuando se realiza la testing, todavía debe hacerlo una queue de asíncrono : nunca se sabe qué otros processs podría tener el dispositivo, lo que podría ralentizar el almacenamiento una vez que la aplicación esté en manos de los usuarios .

Las versiones más recientes de iOS hacen que save de manera asíncrona sea realmente muy fácil usando Grand Central Dispatch (GCD). Los pasos son:

  1. Cree una NSBlockOperation que NSBlockOperation la image
  2. En el bloque de finalización de la operación del bloque, lea la image del disco y visualícela. La única advertencia aquí es que debe usar la queue principal para mostrar la image: todas las operaciones de interfaz de usuario deben ocurrir en el hilo principal .
  3. ¡Agregue la operación de bloque a una queue de operaciones y mire cómo se va!

Eso es. Y aquí está el código:

 // Create a block operation with our saves NSBlockOperation* saveOp = [NSBlockOperation blockOperationWithBlock: ^{ [UIImagePNGRepresentation(image) writeToFile:file atomically:YES]; [UIImagePNGRepresentation(thumbImage) writeToFile:thumbfile atomically:YES]; }]; // Use the completion block to update our UI from the main queue [saveOp setCompletionBlock:^{ [[NSOperationQueue mainQueue] addOperationWithBlock:^{ UIImage *image = [UIImage imageWithContentsOfFile:thumbfile]; // TODO: Assign image to imageview }]; }]; // Kick off the operation, sit back, and relax. Go answer some stackoverflow // questions or something. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:saveOp]; 

Una vez que se sienta cómodo con este patrón de código, encontrará que lo usa mucho. Es increíblemente útil cuando se generan grandes sets de datos, largas operaciones de carga, etc. Esencialmente, cualquier operación que haga que su interfaz de usuario sea retardada en lo más mínimo es un buen candidato para este código. Recuerde, no puede hacer nada con la interfaz de usuario mientras no esté en la queue principal y todo lo demás es torta.

Sí, lleva time en el iPhone 4, donde el tamaño de la image es de alnetworkingedor de 6 MB. La solución es ejecutar UIImagePNGRepresentation() en un subprocess de background, utilizando performSelectorInBackground:withObject: para que su subprocess de interfaz de usuario no se congele.

Probablemente sea mucho más rápido hacer el cambio de tamaño antes de convertir a PNG.

Pruebe UIImageJPEGRrepresentación con una calidad de compression media. Si el cuello de botella es IO, entonces esto puede resultar más rápido ya que el tamaño de file generalmente será menor que un PNG.

Use Instruments para verificar si UIImagePNGRepresentation es la parte lenta o si está escribiendo los datos en el sistema de files, lo cual es lento.