2009-12-04 14 views
9

La funzione NSSearchPathForDirectoriesInDomain s è ancora il modo migliore per ottenere il percorso della directory Documenti iPhone? Chiedo perché la maggior parte degli argomenti che vedo su questo sono datati l'anno scorso, e sembra ancora un modo piuttosto ingombrante di arrivare a una directory che viene comunemente utilizzata su iPhone. Si potrebbe pensare che ci sarebbe un metodo comodo per questo, ormai, simile a bundlePath di NSBundle, ExecutablePath, eccOttenere la directory dei documenti di iPhone. NSSearchPathForDirectoriesInDomains è ancora l'unico modo?

Giusto per essere chiari, questo significa chiamare "NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, SI)" e tornare un array con il percorso di documenti presso indice 0.

risposta

2

Questo funziona per me, piuttosto breve e dolce

#define kDOCSFOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] 

Cheers!

+7

non è il problema con questo che non è garantito per essere dispositivo-universale se Apple apporta modifiche quadro nel futuro? – iPhoneToucher

+0

doppio male. 1: hard coding il nome significa che si interromperà quando Apple lo cambia. 2: questo è un abuso del preprocessore C. Usa invece una funzione. Potresti persino renderlo una funzione inline, ma che puzza di ottimizzazione prematura –

22

Il modello di applicazione basata su dati principale in Xcode offre questo metodo:

- (NSString *)applicationDocumentsDirectory { 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
return basePath; 
} 

così sembrerebbe che Apple continua ad approvare ottenere la directory di documenti in questo modo. Potresti inserirlo in una categoria, suppongo, ma ho trovato che è sufficiente includere quel metodo nelle poche classi di una determinata app che devono lavorare nella directory dei documenti. Se stai facendo un sacco di file dappertutto, potresti prendere in considerazione il refactoring del tuo codice un po 'per limitare quelle attività a una o due classi di manager.

Per me, almeno, la terza o quarta volta ho detto "Ehi, ottenere la directory dei documenti è un dolore al collo" è stato il punto in cui ho realizzato alcune opportunità per spostare il file giocoleria in una classe dedicata.

+0

+1 grazie mille, mi hai salvato di nuovo la vita :) – swiftBoy

+2

Dato che Xcode 5, dovresti usare: 'NSString * basePath = [percorsi firstObject];' –

17

L'attuale modello di applicazione Core Data iOS in Xcode offre questo metodo:

// Returns the URL to the application's Documents directory. 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 
+0

Dato che Xcode 5, dovresti usare 'firstObject' invece di' lastObject' qui. –

+0

Beh, non penso sia vero. Ho appena provato a creare un nuovo progetto 'Empty Application' in Xcode 5.0.2. Ho controllato il segno di spunta 'Usa dati principali'. E all'interno del file AppDelegate.m vedo che Xcode ha generato lo stesso metodo (usando lastObject) per il recupero della directory dei documenti che ho fornito nella mia risposta. Quindi usare lastObject deve essere il modo corretto per farlo. Se la pensi diversamente, forse puoi elaborarla un po 'di più e fornire una risposta completa a questa domanda. –

+1

'-lastObject' è una soluzione semplice da pre-Xcode 5 ed è compatibile con iOS2 mentre firstObject è compatibile solo con iOS4. La verità qui è che vuoi un po '-anyObject' perché l'ordine degli oggetti restituiti non è documentato. Ma la logica suggerisce che il risultato più adatto è stato il primo aggiunto all'array, quindi molte persone usano '[0]'. Sfortunatamente, se array è vuoto, si verificherà un'eccezione, quindi '-lastObject' è stato più semplice (non meglio) per qualche tempo, fino a quando' -firstObject' è stato reso pubblico con Xcode 5. Apple probabilmente non ha ancora aggiornato tutti gli esempi. –

Problemi correlati