У меня есть это приложение с полноэкранным tableView, который отображает кучу мелких изображений. Эти изображения вытягиваются из Интернета, обрабатываются фоновым потоком, а затем сохраняются на диск, используя что-то вроде:
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
});
}
});
Моя проблема в том, что в первом случае прокрутка является маслом гладким. Но во втором случае (когда он читает изображение непосредственно с диска), прокрутка является очень резкой, даже когда изображение загружается. Рисование - вот что вызывает отставание. Используя инструменты, я вижу, что copyImageBlockSetPNG
, png_read_now
и inflate
занимают большую часть процессора (они не при назначении self.image
- UIGraphicsGetImageFromCurrentImageContext()
)
Я предполагаю, что это происходит, потому что в первом случае UIImage является сырым результатом чертежа, тогда как во втором случае он должен разжимать PNG каждый раз при его рисовании. Я пытался использовать JPG вместо PNG, и получаю аналогичные результаты.
Есть ли способ исправить это? Может быть, чтобы он только распаковывал PNG при первом обращении?