CGImage / UIImage chargement paresseux sur le thread de l'interface utilisateur provoque stutter

Mon programme affiche un défilement horizontal de la surface carrelée avec UIImageViews de gauche à droite. Le Code s'exécute sur le thread de l'INTERFACE utilisateur de s'assurer que les nouveaux-visible UIImageViews avoir un fraîchement chargés UIImage affecté. Le chargement se passe sur un thread d'arrière-plan.

Tout fonctionne presque bien, sauf qu'il n'y est une bégayer comme chaque image devient visible. Au début, je pensais que mon fond travailleur a été verrouillage quelque chose dans le thread de l'INTERFACE utilisateur. J'ai passé beaucoup de temps à le regarder et finalement réalisé que la UIImage est en train de faire quelque supplément de traitement différée sur le thread d'INTERFACE utilisateur quand il devient visible. Ce qui m'intrigue, c', depuis mon thread de travail a code explicite pour la décompression de données de format JPEG.

De toute façon, sur une intuition, j'ai écrit du code de rendu temporaire contexte graphique sur le thread d'arrière-plan et bien sûr, le bégaiement s'en alla. Le UIImage est maintenant en pré-chargé sur mon thread de travail. So far So good.

Le problème est que ma nouvelle "force de lazy load image" méthode n'est pas fiable. Il provoque des intermittents EXC_BAD_ACCESS. Je n'ai aucune idée de ce que UIImage la réalité derrière les coulisses. C'est peut-être la décompression JPEG données. De toute façon, la méthode est la suivante:

+ (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();
}

Et la EXC_BAD_ACCESS qui se passe sur le CGContextDrawImage ligne. QUESTION 1: Suis-je autorisé à faire cela sur un thread autre que le thread d'INTERFACE utilisateur? QUESTION 2: Quel est le UIImage fait "pré-chargement"? QUESTION 3: Quel est le moyen officiel pour résoudre ce problème?

Merci pour la lecture de tout ce qui, tout conseil serait grandement apprécié!

source d'informationauteur JBx