2009-12-04 12 views
9

Es función de la NSSearchPathForDirectoriesInDomain s sigue siendo la mejor manera de obtener la ruta del directorio de documentos iPhone? Lo pregunto porque la mayoría de los temas que ver en este último año son anticuadas, y todavía parece ser una manera bastante engorroso de llegar a un directorio que se utiliza comúnmente en los iPhone. Se podría pensar que habría un método de conveniencia para esto por ahora, similar a bundlePath de NSBundle, ExecutablePath, etc.Obtener el directorio de documentos de iPhone. ¿NSSearchPathForDirectoriesInDomains sigue siendo la única manera?

Para que quede claro, esto significa llamar "NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, SI)" y volver a una matriz con la ruta de los documentos en el índice 0.

Respuesta

2

Esto funciona para mí, bastante corto y dulce

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

Salud!

+7

no es el problema con esto que no se garantiza que sea dispositivo universal si Apple hace que los cambios estructurales en el futuro? – iPhoneToucher

+0

doble mal. 1: codificación dura del nombre significa que se romperá cuando Apple lo cambie. 2: esto es un abuso del preprocesador C. Use una función en su lugar. Puede ser que incluso hacer que sea una función en línea, pero que huele a la optimización prematura –

22

La plantilla de aplicación basada en datos básicos en Xcode proporciona este método:

- (NSString *)applicationDocumentsDirectory { 

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

por lo que parece que Apple sigue respaldando conseguir el directorio de documentos de esa manera. Podría ponerlo en una categoría, supongo, pero he descubierto que es suficiente incluir ese método en las pocas clases de una aplicación determinada que necesitan trabajar en el directorio de documentos. Si está haciendo una gran cantidad de archivos por todas partes, podría considerar refactorizar un poco su código para limitar esas tareas a una o dos clases de administrador.

Para mí, al menos, la tercera o cuarta vez que dije "Oye, obtener el directorio de documentos es un dolor en el cuello" fue el momento en que me di cuenta de algunas oportunidades para cambiar el malabarismo de archivo en una clase dedicada.

+0

1 gracias mucho, me salvaste la vida de nuevo :) – swiftBoy

+2

Desde Xcode 5, se debe utilizar: 'NSString * = [basePath caminos firstObject];' Desde –

17

La plantilla actual aplicación de Datos Básicos en Xcode iOS proporciona este método:

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

Xcode 5, se debe utilizar 'firstObject' en lugar de' lastObject' aquí. –

+0

Bueno, no creo que eso sea cierto. Acabo de intentar crear un nuevo proyecto de 'Aplicación vacía' en Xcode 5.0.2. He marcado la marca de verificación 'Usar datos básicos'. Y dentro del archivo AppDelegate.m veo que Xcode ha generado el mismo método (usando lastObject) para la recuperación del directorio de documentos que he proporcionado en mi respuesta. Entonces, usar lastObject debe ser la forma correcta de hacerlo. Si piensas lo contrario, tal vez puedas elaborarlo un poco más y dar una respuesta completa a esta pregunta. –

+1

'-lastObject' es una solución fácil de pre-Xcode 5 y es compatible con iOS2 mientras firstObject sólo es compatible con iOS4. La verdad es que quieres '' -anyObject' porque el orden de los objetos devueltos no está documentado. Pero la lógica sugiere que el resultado más adecuado fue el primero agregado al conjunto, por lo tanto, mucha gente usa '[0]'. Desafortunadamente, si la matriz está vacía, se produciría una excepción, por lo que '-lastObject' fue más fácil (no mejor) durante un tiempo, hasta que' -firstObject' se hizo público con Xcode 5. Apple probablemente aún no actualizó todos los ejemplos. –

Cuestiones relacionadas