У меня есть собственный класс загрузчика изображений, он содержит очередь и загружает изображения по одному (или определенное количество) за раз, записывает их в папку кеша и при необходимости извлекает из папки кеша. У меня также есть подкласс UIImageView, которому я могу передать URL-адрес, через класс загрузчика изображений он будет смотреть, существует ли изображение на устройстве, и показывать его, если оно есть, или загружать и показывать его после завершения.
После того, как изображение загрузится, я делаю следующее. Я создаю UIImage из загруженных NSData, сохраняю загруженные NSData на диск и возвращаю UIImage.
// This is executed in a background thread
downloadedImage = [UIImage imageWithData:downloadedData];
BOOL saved = [fileManager createFileAtPath:filePath contents:downloadedData attributes:attributes];
// Send downloadedImage to the main thread and do something with it
Я делаю это, чтобы получить существующее изображение.
// This is executed in a background thread
if ([fileManager fileExistsAtPath:filePath])
{
NSData* imageData = [fileManager contentsAtPath:filePath];
retrievedImage = [UIImage imageWithData:imageData];
// Send retrievedImage to the main thread and do something with it
}
Как видите, я всегда создаю UIImage непосредственно из загруженных NSData, я никогда не создаю NSData с помощью UIImagePNGRepresentation, поэтому изображение никогда не сжимается. Когда вы создаете UIImage из сжатых NSData, UIImage распаковывает его прямо перед рендерингом в основном потоке и, таким образом, блокирует пользовательский интерфейс. Поскольку теперь у меня есть UITableView с множеством небольших изображений, которые необходимо загрузить или получить с диска, это было бы неприемлемо, так как это сильно замедлило бы мою прокрутку.
Теперь моя проблема. Пользователь также может выбрать фотографию из фотопленки, сохранить ее, и она также должна появиться в моем UITableView. Но я не могу найти способ превратить UIImage из камеры в NSData без использования UIImagePNGRepresentation. Итак, вот мой вопрос.
Как я могу преобразовать UIImage в несжатый NSData, чтобы я мог позже преобразовать его обратно в UIImage, используя imageWithData, чтобы его не нужно было распаковывать перед рендерингом?
or
Есть ли способ выполнить распаковку перед отправкой UIImage в основной поток и кэшировать его, чтобы его нужно было распаковать только один раз?
Заранее спасибо.