小さな画像をたくさん表示するフルスクリーンのtableViewを備えたこのアプリがあります。これらの画像は Web から取得され、バックグラウンド スレッドで処理され、次のような方法でディスクに保存されます。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
// code that adds some glosses, shadows, etc
UIImage *output = UIGraphicsGetImageFromCurrentImageContext();
NSData* cacheData = UIImagePNGRepresentation(output);
[cacheData writeToFile:thumbPath atomically:YES];
dispatch_async(dispatch_get_main_queue(), ^{
self.image = output; // refreshes the cell using KVO
});
});
このコードは、セルが最初に表示されたときにのみ実行されます (その後、画像は既にディスク上にあるため)。その場合、セルは以下を使用してロードされます。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *savedImage = [UIImage imageWithContentsOfFile:thumbPath];
if(savedImage) {
dispatch_async(dispatch_get_main_queue(), ^{
self.image = savedImage; // refreshes the cell using KVO
});
}
});
私の問題は、最初のケースでは、スクロールがバタースムーズであることです。しかし、2 番目のケース (ディスクから直接画像を読み取る場合) では、画像が読み込まれた後でも、スクロールが非常にぎくしゃくします。描画が遅れの原因です。Instruments を使用すると、 が CPU のほとんどを占有していることがわかりますcopyImageBlockSetPNG
(に割り当てているときはそうではありませpng_read_now
ん) 。inflate
self.image
UIGraphicsGetImageFromCurrentImageContext()
最初のケースではUIImageが描画の生の出力であるのに対し、2番目のケースではPNGを描画するたびに解凍する必要があるため、これが発生すると想定しています。PNG の代わりに JPG を使用してみましたが、同様の結果が得られました。
これを修正する方法はありますか?たぶん、最初に描画されたときにのみPNGを解凍するようにするには?