Carregar UIImage no thread de segundo plano causa erro no ImageIO
Estou trabalhando em um projeto iOS que carrega UIImages de URLs em um encadeamento em segundo plano e os exibe em uma exibição de rolagem paginada horizontalmente. Esse comportamento deve imitar o do aplicativo de biblioteca de fotos nativa do iPhone. Tenho tudo configurado de uma maneira que acredito que funcione, mas, ao desenhar o UIImages no contexto principal de gráficos da interface do usuário, ocasionalmente vejo essa mensagem impressa no console:
ImageIO: <ERROR> CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedImageBlockData: bad readSession [0x685e590]
Apesar desse erro, parece que o aplicativo funciona perfeitamente bem e que as imagens são desenhadas conforme o esperado. Devo simplesmente ignorar esse "ERRO" ou devo alterar meu método para carregar imagens no segmento de plano de fundo? Atualmente, carrego a imagem em um thread de segundo plano usando o 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];
}
}
MinhasloadComplete:
método @ simplesmente retém a imagem passada como uma variável de instância, que é posteriormente desenhada nodrawRect:
método. DentrodrawRect:
, Estou usando o UIImagedrawInRect:
, que parece ser o autor da mensagem de erro no console. No entanto, desenhando o CGImageRef subjacente da imagem usandoCGContextDrawImage
ainda causa o mesmo erro. O código fonte completo pode ser encontrado no repositório Github deste projeto, no arquivo ANAsyncImageView.m.
EDIT: Agora alterei o thread de segundo plano para carregar uma CGImage do arquivo e, em seguida, retornar a chamada para o thread principal, passando o CGImageRef usando uma ponte de ligação gratuita. Infelizmente, isso ainda cria o mesmo problema, provando para mim queimageWithCGImage:
deve, de alguma forma, manter uma referência à CGImage original. Confira o código no arquivo vinculado acima (para o repositório do Github) para obter o 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);