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?

questionAnswers(1)

yourAnswerToTheQuestion