私のプログラムは、左から右に UIImageViews で並べられた水平スクロール サーフェスを表示します。コードは UI スレッドで実行され、新しく表示された UIImageView に新たにロードされた UIImage が割り当てられるようにします。読み込みはバックグラウンド スレッドで行われます。
各画像が表示されるときに途切れがあることを除いて、すべてがほぼ正常に機能します。最初は、バックグラウンド ワーカーが UI スレッドで何かをロックしていると思いました。私はそれを見て多くの時間を費やしましたが、最終的には、UIImage が最初に表示されたときに、UI スレッドで余分な遅延処理を行っていることに気付きました。私のワーカー スレッドには JPEG データを圧縮解除するための明示的なコードがあるため、これは私を困惑させます。
とにかく、直感で、バックグラウンド スレッドの一時的なグラフィックス コンテキストにレンダリングするコードを書きました。UIImage がワーカー スレッドにプリロードされるようになりました。ここまでは順調ですね。
問題は、私の新しい「画像の強制遅延読み込み」メソッドが信頼できないことです。断続的な EXC_BAD_ACCESS が発生します。UIImage が実際に舞台裏で何をしているのかわかりません。JPEGデータを解凍しているのかもしれません。とにかく、方法は次のとおりです。
+ (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();
}
EXC_BAD_ACCESS は CGContextDrawImage 行で発生します。質問 1: UI スレッド以外のスレッドでこれを行うことはできますか? 質問 2: UIImage が実際に「プリロード」しているのは何ですか? 質問 3: この問題を解決する公式の方法は何ですか?
すべてをお読みいただきありがとうございます。アドバイスをいただければ幸いです。