У меня есть это приложение с полноэкранным 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 только при первом рисовании?