2012-06-12 29 views
6

Estoy usando un UIImagePickerController para permitir a los usuarios seleccionar una imagen de la biblioteca de imágenes. Luego quiero comenzar la ubicación de ese archivo en una base de datos sqlite para poder consultarlo más adelante.Cargando UIImage desde UIImagePickerControllerReferenceURL

He estado haciendo un poco de google sobre cómo hacer esto y me estoy quedando corto. Sé que puedo conseguir el ReferenceURL del tema llamando dentro del método delegado:

NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"] 

Esto me da un objeto NSURL válido y si la salida me puedo picURL.absoluteString lo que parece ser una URL válida para el assets-library ubicación del archivo. Sin embargo, si intento crear un objeto NSData con esta url para poder crear un UIImage, el código falla porque NSData devuelve nil. Por ejemplo:

NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"] 
    NSString *stringUrl = picURL.absoluteString; 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]]; 
    imgMain.image = [UIImage imageWithData:data] 

que se dan cuenta de que estoy siendo un poco repetitiva pero el punto aquí es para agarrar una cadena que representa la URL que puedo almacenar en sqlite y luego usar dicha cadena más adelante para crear una imagen (por lo que el el código anterior representa esa línea de pensamiento).

me encontré con algo de información flotando sobre el uso de ALAssetsLibrary pero eso me dio todo tipo de ataques, ya que no parece jugar bonito con IOS 5 y ARC. Sigo recibiendo mensajes de error 'Receptor tipo ALAsset por instancia mensaje es una declaración directa. Puedo establecer propiedades en el archivo que hace referencia a ALAsset/ALAssetsLibrary ignorar ARC que detiene el error de generación, pero entonces tan pronto como dejo el bloque de código que los datos se va. Ver más abajo:

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 no devolvió una imagen válida, pero tan pronto como el código sale del resultBlock los contenidos de los datos se han ido (es decir returnValue se anula de nuevo).

Entonces mi pregunta es: ¿cómo uso el UIImagePickerControllerReferenceURL y lo convierto en una cadena que puedo almacenar en sqlite y luego uso dicha cadena para crear un objeto UIImage válido más adelante?

+0

¿Llegaste a algún lado con esto? –

Respuesta

9

Parece que estás en el camino correcto, para guardar la URL activo.

Save 
NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"] 
NSString *stringUrl = picURL.absoluteString; 


Reload AssetURL 
NSURL asssetURL = [NSURL URLWithString:stringUrl] 

En cuanto a la carga de los activos más adelante, voy a basar en el supuesto de que no se esté usando arco. Lo que explicaría por qué estás de vuelta. El valor es nulo.

¿Ha intentado agregar un retener al resultado? por ejemplo:

NSURL *referenceURL = [NSURL URLWithString:savedAssetURLString] 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    __block UIImage *returnValue = nil; 
    [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) { 
     returnValue = [[UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]] retain]; //Retain Added 
    } failureBlock:^(NSError *error) { 
     // error handling 
    }]; 
    [library release];