Cargar UIImage en el subproceso de fondo provoca un error de Image
Estoy trabajando en un proyecto de iOS que carga UIImages de URL en un hilo de fondo y los muestra en una vista de desplazamiento paginada horizontalmente. 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 principal de la interfaz de usuario, 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 un hilo de fondo usando UIImageinitWithData:
método:
- (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];
}
}
MiloadComplete:
l método @ simplemente retiene la imagen pasada como una variable de instancia, que luego se dibuja en la vistadrawRect:
método. EndrawRect:
, Estoy usando el UIImagedrawInRect:
método, que parece ser el autor del mensaje de error en la consola. Sin embargo, dibujando CGImageRef subyacente de la imagen usandoCGContextDrawImage
todavía causa el mismo error. El código fuente completo se puede encontrar en el repositorio de Github de este proyecto, en el archivo ANAsyncImageView.m.
EDIT: ahora he cambiado el subproceso de fondo para cargar una CGImage desde el archivo y luego devolver la llamada al subproceso principal, pasando el CGImageRef mediante un puente sin cargo. Desafortunadamente, esto todavía crea el mismo problema, lo que me demuestra que UIImage'simageWithCGImage:
de alguna manera debe mantener una referencia a la imagen CG original. Consulte el código en el archivo vinculado anteriormente (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);