2012-06-12 14 views
6

Sto utilizzando un UIImagePickerController per consentire agli utenti di selezionare un'immagine dalla libreria di immagini. Quindi voglio iniziare la posizione di quel file in un database SQLite in modo da poter fare riferimento ad esso in seguito.Caricamento UIImage da UIImagePickerControllerReferenceURL

Ho fatto qualche ricerca su come fare questo e sto arrivando piuttosto breve. So che posso ottenere il ReferenceURL della voce chiamando all'interno del metodo delegato:

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

Questo mi dà un oggetto NSURL valido e se l'uscita io picURL.absoluteString posso quello che sembra essere un URL valido per il posizione della libreria delle risorse del file. Tuttavia, se provo a creare un oggetto NSData con questo URL, così posso creare a turno un UIImage, il codice non funziona perché NSData restituisce zero. Per esempio:

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

mi rendo conto che io sia un po 'ripetitivo qui, ma il punto è quello di prendere una stringa che rappresenta l'URL che posso conservare in SQLite e quindi utilizzare detto stringa di seguito per creare un'immagine (in modo che il il codice sopra rappresenta quel treno di pensiero).

Ho trovato alcune informazioni che ruotano attorno a utilizzare ALAssetsLibrary ma che mi ha dato tutti i tipi di attacchi in quanto non sembra giocare bene con iOS 5 e ARC. Continuo a ricevere i messaggi di errore "Tipo ricevitore ALAsset per il messaggio di istanza è una dichiarazione diretta. Posso impostare proprietà sul file che fa riferimento a ALAsset/ALAssetsLibrary per ignorare ARC che interrompe l'errore di compilazione, ma non appena esco dal blocco di codice i dati scompaiono. Vedi sotto:

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 fa ritorno un'immagine valida ma appena il codice esce dal resultBlock i contenuti dei dati sono andati (cioè returnValue ridiventa nullo).

Quindi la mia domanda è: come utilizzare UIImagePickerControllerReferenceURL e convertirlo in una stringa che posso memorizzare in sqlite e quindi utilizzare tale stringa per creare un oggetto UIImage valido in un secondo momento?

+0

Sei arrivato da qualche parte con questo? –

risposta

9

Sembra che tu sia sulla strada giusta, per salvare l'url della risorsa.

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


Reload AssetURL 
NSURL asssetURL = [NSURL URLWithString:stringUrl] 

Per quanto riguarda il caricamento della risorsa in un secondo momento, ho intenzione di basare sul presupposto che non stai utilizzando arco. Il che spiegherebbe perché sei di ritorno. Valore zero.

Hai provato ad aggiungere un fermo al risultato? ad esempio:

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];