Carregando UIImage de UIImagePickerControllerReferenceURL
Eu estou usando um UIImagePickerController para permitir que os usuários selecionem uma imagem da biblioteca de imagens. Eu então quero começar a localização desse arquivo em um banco de dados sqlite para que eu possa consultá-lo mais tarde.
Eu estive fazendo algumas pesquisas sobre como fazer isso e estou chegando bem rápido. Eu sei que posso obter o ReferenceURL do item chamando dentro do método delegado:
NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]
Isso me dá um objeto NSURL válido e, se eu gerar picURL.absoluteString, posso o que parece ser um URL válido para o local da biblioteca de ativos do arquivo. No entanto, se eu tentar criar um objeto NSData com essa url para que eu possa criar um UIImage, o código falhará porque NSData retornará nil. Por exemplo:
NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]
NSString *stringUrl = picURL.absoluteString;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]];
imgMain.image = [UIImage imageWithData:data]
Eu percebo que estou sendo um tanto repetitivo aqui, mas o ponto é pegar uma representação de string da URL que eu possa armazenar em sqlite e depois usar a string depois para criar uma imagem (então o código acima representa essa linha de pensamento).
Eu encontrei algumas informações sobre o uso do ALAssetsLibrary, mas isso me deu todos os tipos de ataques, já que ele não parece funcionar bem com o iOS 5 e o ARC. Continuo recebendo mensagens de erro 'O tipo de receptor ALAsset, por exemplo, mensagem é uma declaração antecipada. Eu posso definir propriedades no arquivo que faz referência a ALAsset / ALAssetsLibrary para ignorar o ARC que interrompe o erro de compilação, mas, assim que eu saio do bloco de código, os dados desaparecem. Ver abaixo:
NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
__block UIImage *returnValue = nil;
[library assetForURL:referenceURL resultBlock:^(ALAsset *asset) {
returnValue = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
} failureBlock:^(NSError *error) {
// error handling
}];
[library release];
returnValue retorna uma imagem válida, mas assim que o código sai do resultBlock, o conteúdo dos dados desaparece (isto é, returnValue se torna nulo novamente).
Então, a minha pergunta é: como eu uso o UIImagePickerControllerReferenceURL e convertê-lo em uma string que eu possa armazenar em sqlite e depois usar a referida string para criar um objeto UIImage válido mais tarde?