2010-10-28 15 views
7

Ho circa 60 immagini che voglio memorizzare in Core Data, 30 dei quali sono avatar e hanno il prefisso avt_filename_00X.png e 30 sono più piccoli e hanno un prefisso diverso.Ottieni percorsi immagine da NSBundle in Objective C?

Anziché memorizzare tutte le immagini come BLOB in Core Data/SQLite, voglio memorizzare i percorsi per ogni immagine trovata (nello stesso modo in cui si memorizzerebbero i percorsi di immagine per un database MySQL).

Tuttavia, non sono sicuro di come ottenere il percorso dell'immagine come trovato in NSBundle.

posso ottenere il percorso alla NSDocumentDirectory via:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager fileExistsAtPath:documentsDirectory]; 

NSLog(@"documentsDirectory = %@", documentsDirectory); 

e posso caricare l'immagine e aggiungerla a un array.

if (qty == 0) 
{ 
    //NSLog(@"fileToLoad = %@", fileToLoad); 

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileToLoad ofType:fileExt]]; 

    [self.avtList addObject:img]; 

    [img release]; 

} else { 

    // load multiple image into an array 
    // not coded yet 
} 

Ma, ciò che io sono sicuro di si:

  1. Come posso afferrare il percorso in cui il computer ha trovato una volta l'immagine suo interno il NSBundle?

  2. Come posso essere sicuro che il percorso funzioni quando l'app è su un dispositivo?

L'idea sarebbe quella di ottenere tutte le immagini memorizzate in un array e poi spingerli a Core Data/SQLite in un secondo momento.

risposta

25

Il modo corretto per ottenere il percorso completo di una risorsa nel pacchetto principale è:

[[NSBundle mainBundle] pathForResource:@"avt_filename_00X" ofType:@"png"] 

(oppure è in grado di fornire la stringa vuota per 'OfType' se si preferisce includere l'estensione della risorsa nome)

Ma da nessuna parte nei documenti è il percorso garantito per rimanere lo stesso su dispositivi, iterazioni del sistema operativo, ecc. È il percorso di quel file dal pacchetto di applicazioni nell'ambiente corrente, garantito per rimanere valido per la durata di questa esecuzione solo dell'applicazione.

Poiché il percorso dell'applicazione e quindi delle sue risorse non è garantito per rimanere lo stesso, penso che sia esplicitamente pericoloso inserirlo in un database SQL con qualsiasi mezzo.

Potresti forse adottare uno schema in cui un nome file che inizia in/è un percorso completo, si presuppone che uno senza/all'inizio sia nel bundle, ovvero che è possibile applicare la logica all'esterno del database?

+1

Sì, questo ha senso. Penso che semplicemente memorizzerò il nome del file in un database e poi userò il codice NSBundle in una fase successiva per riprendere l'immagine. – zardon

2

Come posso essere sicuro che il percorso sia funzionante quando l'app è su un dispositivo?

Qui sta il problema: non puoi. Sarebbe meglio lasciare che i percorsi venissero gestiti al volo, e magari memorizzare semplicemente i nomi dei file.

+0

Oh non lo sapevo. Ho pensato che potevi usare il percorso completo e usarlo. Se scrivo per memorizzare il nome file e il percorso file, dovrei controllare che esista prima di fare qualcosa con esso? – zardon

+0

Assolutamente, perché le possibilità che funzioni correttamente in qualsiasi altro posto rispetto al proprio computer sono molto ridotte.Ad esempio, se un utente inserisce l'applicazione nella propria cartella/Users/username/Applications, il cambio di username renderà il percorso memorizzato inutilizzabile. –