2011-02-10 4 views
45

J'essaie d'accéder à un magasin de fichiers XML dans le répertoire des ressources. J'utilise NSURL pour accéder à ce fichier en utilisant NSURLConnection (ce fichier va être changé pour un service distant dans le futur).Accès au fichier local à l'aide de 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 classe qui démarre la connexion implémente les méthodes de NSURLConnection:

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

Une fois que je lance ce simulateur meurt, aucun message sont imprimés à la console, donc je suis à une perte pour savoir où chercher . Des idées, ou suis-je en train de faire ça complètement faux?

Répondre

17

Cela fonctionne également:

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

Hope this helps !

+1

Celui-ci donne le chemin du système de fichiers, pas l'URL. Je ne comprends pas pourquoi, mais l'OP veut charger son XML à partir de l'URL. Peut-être pour un portage plus facile vers des sources web ... –

+0

Bien sûr. Merci Seva - vous avez bien raison! –

+9

Bien que ma réponse ait été marquée comme la bonne réponse, je crois que la réponse de Seva est correcte! Cela peut-il être mis à jour? –

152

Essayer de charger quoi que ce soit à partir du système de fichiers root est incorrect, mauvais, faux. Certainement faux sur l'appareil, et probablement faux sur le simulateur. Le répertoire des ressources doit être accessible via la classe NSBundle.

Par exemple, pour obtenir une URL d'un fichier appelé "Data.txt" dans les ressources, utilisez ce qui suit:

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

D'accord. C'est la manière correcte d'accéder au dossier des ressources! –

+2

J'étais sous l'impression '/' sur iOS accédé à l'application sandbox root, je pourrais facilement me tromper. Voici le code que j'ai utilisé pour obtenir l'url, l'application explose toujours, mais cela semble être un mouvement beaucoup plus intelligent. NSURL * url = [[NSBundle mainBundle] URLForResource: @ "XMLTest" avecExtension: @ "xml"]; ' – botptr

+1

Sur le simulateur, il semble,/signifie la racine de l'ordinateur hôte. Ce qui signifie que vous obtiendrez des résultats très différents sur l'appareil et sur simulateur - pas bon. Et de toute façon, la racine du bac à sable n'est pas la même que celle du dossier des ressources de l'ensemble. –

2

Vous pouvez essayer ce fichier en supposant ici

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

est dans le bureau.

+2

Ceci est acceptable et utile pour les échafaudages temporaires. –

+0

J'utilise le chemin absolu du fichier, c'est utile pour moi. – tomfriwel

31

Si vous souhaitez obtenir une URL à partir d'un chemin (par exemple, parce que vous avez créé un fichier dans NSTemporaryDirectory() et vous avez besoin d'obtenir que comme une URL), vous pouvez facilement le faire en utilisant la méthode fileURLWithPath de NSURL:

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

Beaucoup plus facile que + URLWithString: et d'autres méthodes.

+4

C'est la bonne façon, '+ fileURLWithPath:' PUMP UP! –

1

Swift 3:

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