2011-02-10 9 views
45

Estoy intentando acceder a un almacén de archivos XML en el directorio de recursos. Estoy usando NSURL para acceder a este archivo usando NSURLConnection (este archivo se va a intercambiar para un servicio remoto en el futuro).Acceso al archivo local utilizando NSURL

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL 
URLWithString:@"file:///XMLTest.xml"] 
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 

NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
if (connection) { 
    // Create the NSMutableData to hold the received data. 
    // receivedData is an instance variable declared elsewhere. 
    response = [[NSMutableData data] retain]; 
} else { 
    NSLog(@"Could not create connection"); 
} 

La clase que inicia la conexión implementa los métodos NSURLConnection:

connection:willCacheResponse: 
connection:didReceiveData: 
connectionDidFinishLoading: 
connectionDidFinishLoading: 

Una vez que lanzo este simulador muere, no hay mensajes se imprimen en la consola, así que estoy en una pérdida de dónde buscar . Alguna idea, o solo estoy haciendo esto completamente mal?

Respuesta

17

Esto también funcionaría:

NSString *path = [[NSBundle mainBundle] pathForResource:@"XMLTest" ofType:@"xml"]; 

espero que esto ayude !

+1

Este proporciona la ruta del sistema de archivos, no la URL. No entiendo por qué, pero el OP quiere cargar su XML desde la URL. Tal vez para facilitar la migración a fuentes basadas en la web ... –

+0

Por supuesto. Gracias Seva - ¡estás en lo cierto! –

+9

Aunque mi respuesta ha sido marcada como la respuesta correcta, ¡creo que la respuesta de Seva es realmente correcta! ¿Esto puede ser actualizado? –

152

Intentando cargar algo desde el sistema de archivos root es incorrecto, incorrecto, incorrecto. Definitivamente mal en el dispositivo, y probablemente esté mal en el simulador. Se debe acceder al directorio de recursos a través de la clase NSBundle.

Por ejemplo, para obtener una URL para un archivo llamado "Data.txt" en los recursos, utilice la siguiente:

NSURL *MyURL = [[NSBundle mainBundle] 
    URLForResource: @"Data" withExtension:@"txt"]; 
+1

acuerdo. ¡Esta es la forma correcta de acceder a la carpeta de recursos! –

+2

Tenía la impresión de que "/" en iOS accedió a la raíz de la zona de pruebas de la aplicación, podría estar muy equivocado. Aquí está el código que he usado para obtener la url, la aplicación sigue explotando, pero esto parece una jugada mucho más inteligente. 'NSURL * url = [[NSBundle mainBundle] URLForResource: @" XMLTest "withExtension: @" xml "];' – botptr

+1

En el simulador, parece,/significa la raíz del equipo host. Lo que significa que obtendrá resultados muy diferentes en el dispositivo y en el simulador, lo que no es bueno. Y de todos modos, la raíz de la caja de arena no es lo mismo que la carpeta de recursos del paquete. –

2

Usted puede intentar este archivo

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"file://localhost/Users/userName/Desktop/XMLTest.xml"]]; 

aquí suponiendo que está en el escritorio.

+2

Esto es aceptable y útil para andamios temporales. –

+0

Uso la ruta absoluta del archivo, esto es útil para mí. – tomfriwel

31

Si desea obtener una URL desde una ruta (por ejemplo, debido a que ha creado un archivo en NSTemporaryDirectory() y que necesita para obtener que como URL) que puede hacerlo fácilmente utilizando el método fileURLWithPath de NSURL:

NSString* tempPath = NSTemporaryDirectory(); 
NSString* tempFile = [tempPath stringByAppendingPathComponent:fileName]; 
NSURL* URL = [NSURL fileURLWithPath:tempFile]; 

Mucho más fácil que + URLWithString: y otros métodos.

+4

Esta es la manera correcta, '+ fileURLWithPath:' PUMP UP! –

1

Swift 3:

let myFileName = "somefilename" 
    let myURL = Bundle.main.url(forResource: myFileName, withExtension: "png") 
Cuestiones relacionadas