create ios cocoa-touch uikit uiimage core-graphics

ios - create - uiimage frame swift 4



Cargar UIImage en el hilo de fondo causa un error de ImageIO (1)

UIKit no es una clase segura para subprocesos. Por lo tanto, no debes llamar a UIImage desde el fondo.

En lugar de crear UIImages, renderiza tus archivos de imágenes en CGImageRefs. Puede pasar uno de estos al hilo principal y generar un UIImage a partir de eso (aún se beneficiará al mover el heavy-lifting de descompresión de imagen al fondo).

Estoy trabajando en un proyecto de iOS que carga UIImages de las URL en una cadena de fondo y las muestra en una vista de desplazamiento con paginación horizontal. Este comportamiento debe imitar el de la aplicación de biblioteca de fotos nativa para iPhone. Tengo todo configurado de una manera que creo que debería funcionar, pero al dibujar los UIImages en el contexto gráfico de la interfaz de usuario principal, ocasionalmente veo este mensaje impreso en la consola:

ImageIO: <ERROR> CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedImageBlockData: bad readSession [0x685e590]

A pesar de este error, parece que la aplicación funciona perfectamente bien y que las imágenes se dibujan como se esperaba. ¿Debería simplemente ignorar este "ERROR" o debería cambiar mi método para cargar imágenes en el hilo de fondo? Actualmente, cargo la imagen en una initWithData: fondo usando el método UIImage initWithData: :

- (void)backgroundLoadThread:(NSURL *)url { @autoreleasepool { NSData * imageData = [NSData dataWithContentsOfURL:url]; UIImage * theImage = [[UIImage alloc] initWithData:imageData]; if ([[NSThread currentThread] isCancelled]) { #if !__has_feature(objc_arc) [theImage release]; #endif return; } [self performSelectorOnMainThread:@selector(loadComplete:) withObject:theImage waitUntilDone:NO]; } }

Mi método loadComplete: simplemente conserva la imagen pasada como una variable de instancia, que luego se dibuja en el método drawRect: view. En drawRect: estoy usando el método UIImage drawInRect: que parece ser el responsable del mensaje de error en la consola. Sin embargo, dibujar el CGImageRef subyacente de la imagen usando CGContextDrawImage sigue CGContextDrawImage el mismo error. El código fuente completo se puede encontrar en el repositorio Github de este proyecto, en el archivo ANAsyncImageView.m .

EDITAR: ahora he cambiado el hilo de fondo para cargar un CGImage desde el archivo, y luego volver a llamar al hilo principal, pasando el CGImageRef usando un puente sin cargo. Desafortunadamente, esto todavía crea el mismo problema, demostrándome que la imageWithCGImage: de imageWithCGImage: debe de alguna manera mantener una referencia al CGImage original. Consulte el código en el archivo vinculado arriba (al repositorio de Github) para obtener el código completo:

NSData * imageData = [NSData dataWithContentsOfURL:url]; CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)imageData); CGImageRef loaded = CGImageCreateWithPNGDataProvider(provider, NULL, false, kCGRenderingIntentDefault); CGDataProviderRelease(provider); id imageObj = (id)loaded; [self performSelectorOnMainThread:@selector(loadComplete:) withObject:imageObj waitUntilDone:NO]; CGImageRelease(loaded);