CGImage / UIImage lento carregamento no thread da interface do usuário causa gagueira

Meu programa exibe uma superfície de rolagem horizontal lado a lado com UIImageViews da esquerda para a direita. O código é executado no thread da interface do usuário para garantir que os UIImageViews recém-visíveis tenham um UIImage recém-carregado atribuído a eles. O carregamento acontece em um thread de segundo plano.

Tudo funciona quase bem, exceto que há uma gagueira à medida que cada imagem se torna visível. No começo, pensei que meu agente de plano de fundo estava bloqueando alguma coisa no thread da interface do usuário. Passei muito tempo olhando e finalmente percebi que a UIImage está fazendo algum processamento extra preguiçoso no thread da UI quando se torna visível pela primeira vez. Isso me intriga, pois meu thread de trabalho tem código explícito para descompactar dados JPEG.

Enfim, em um palpite eu escrevi algum código para renderizar em um contexto gráfico temporário no thread de fundo e - com certeza, a gagueira foi embora. O UIImage agora está sendo pré-carregado no meu thread de trabalho. Por enquanto, tudo bem.

A questão é que meu novo método "força de carga lenta de imagem" não é confiável. Isso causa um EXC_BAD_ACCESS intermitente. Eu não tenho ideia do que a UIImage está realmente fazendo nos bastidores. Talvez esteja descomprimindo os dados JPEG. De qualquer forma, o método é:

+ (void)forceLazyLoadOfImage: (UIImage*)image
{
 CGImageRef imgRef = image.CGImage;

 CGFloat currentWidth = CGImageGetWidth(imgRef);
 CGFloat currentHeight = CGImageGetHeight(imgRef);

    CGRect bounds = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

 CGAffineTransform transform = CGAffineTransformIdentity;
 CGFloat scaleRatioX = bounds.size.width / currentWidth;
 CGFloat scaleRatioY = bounds.size.height / currentHeight;

 UIGraphicsBeginImageContext(bounds.size);

 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextScaleCTM(context, scaleRatioX, -scaleRatioY);
 CGContextTranslateCTM(context, 0, -currentHeight);
 CGContextConcatCTM(context, transform);
 CGContextDrawImage(context, CGRectMake(0, 0, currentWidth, currentHeight), imgRef);

 UIGraphicsEndImageContext();
}

E o EXC_BAD_ACCESS acontece na linha CGContextDrawImage. PERGUNTA 1: Posso fazer isso em um segmento diferente do segmento de interface do usuário? PERGUNTA 2: O que é o UIImage realmente "pré-carregamento"? PERGUNTA 3: Qual é a maneira oficial de resolver este problema?

Obrigado por ler tudo isso, qualquer conselho seria muito apreciado!

questionAnswers(4)

yourAnswerToTheQuestion