UIImage para NSData bruto / evitar compactação

Eu tenho minha própria classe de downloader de imagem, ele mantém uma fila e baixa as imagens uma (ou uma certa quantia) por vez, grava-as na pasta cache e as recupera da pasta cache quando necessário. Eu também tenho uma subclasse UIImageView para a qual eu posso passar uma URL, através da classe downloader da imagem ele irá olhar se a imagem já existe no dispositivo e mostrá-lo se isso acontecer, ou baixá-lo e mostrá-lo depois que ele terminar.

Depois que uma imagem termina de ser baixada, faço o seguinte. Eu crio um UIImage a partir do NSData baixado, salve o NSData baixado no disco e retorne o 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

Para recuperar uma imagem existente, faço isso.

// 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
}

Como você pode ver, eu sempre crio um UIImage diretamente do NSData baixado, nunca crio o NSData usando o UIImagePNGRepresentation para que a imagem nunca seja compactada. Quando você cria um UIImage a partir do NSData compactado, o UIImage o descompacta logo antes da renderização no thread principal e, portanto, bloqueia a interface do usuário. Como agora estou tendo um UITableView com uma tonelada de pequenas imagens que precisam ser baixadas ou recuperadas do disco, isso seria inaceitável, pois retardaria imensamente a rolagem.

Agora meu problema. O usuário também pode selecionar uma foto do rolo da câmera, salvá-la e também deve aparecer no meu UITableView. Mas não consigo encontrar uma maneira de transformar o UIImage do rolo da câmera em NSData sem usar o UIImagePNGRepresentation. Então aqui está a minha pergunta.

Como posso converter um UIImage em NSData descompactado para que eu possa convertê-lo de volta para um UIImage posteriormente usando imageWithData para que ele não precise ser descompactado antes de renderizar?

ou

Existe alguma maneira que eu possa fazer a descompressão antes de enviar o UIImage para o thread principal e armazená-lo em cache para que ele só tenha que ser descompactado uma vez?

Desde já, obrigado.

questionAnswers(3)

yourAnswerToTheQuestion