2011-02-10 20 views
45

Próbuję uzyskać dostęp do magazynu plików XML w katalogu zasobów. Używam NSURL, aby uzyskać dostęp do tego pliku przy użyciu NSURLConnection (ten plik zostanie w przyszłości zamieniony na usługę zdalną).Uzyskiwanie dostępu do pliku lokalnego przy użyciu 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"); 
} 

Klasa, która uruchamia połączenie implementuje metody NSURLConnection:

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

Raz uruchomić ten symulator umiera, żadne komunikaty są drukowane na konsoli, więc jestem ze stratą dla gdzie szukać . Jakieś pomysły, czy robię to zupełnie nie tak?

Odpowiedz

17

to również działa:

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

nadzieję, że to pomaga !

+1

Ten podaje ścieżkę do systemu plików, a nie URL. Nie rozumiem dlaczego, ale OP chce załadować swój XML z adresu URL. Może dla łatwiejszego przenoszenia do źródeł internetowych ... –

+0

Oczywiście. Dzięki, Seva - rzeczywiście masz rację! –

+9

Chociaż moja odpowiedź została oznaczona jako poprawna odpowiedź, uważam, że odpowiedź od Seva jest rzeczywiście poprawna! Czy można to zaktualizować? –

152

Próba załadowania czegokolwiek z systemu plików root jest źle, źle, źle. Zdecydowanie źle na urządzeniu i prawdopodobnie źle na symulatorze. Katalog zasobów powinien być dostępny przez klasę NSBundle.

Na przykład, aby uzyskać adres URL do pliku o nazwie "data.txt" w zasobach, należy użyć następujących:

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

Zgoda. To jest poprawny sposób dostępu do folderu zasobów! –

+2

Byłem pod wrażeniem "/" w systemie iOS, który uzyskał dostęp do katalogu głównego piaskownicy aplikacji, mógłbym bardzo łatwo się pomylić. Oto kod, którego użyłem do uzyskania adresu URL, aplikacja wciąż się rozwija, ale wydaje się, że jest to o wiele mądrzejszy ruch. 'NSURL * url = [[NSBundle mainBundle] URLForResource: @" XMLTest "withExtension: @" xml "];' – botptr

+1

Na symulatorze, wygląda na to,/oznacza root komputera głównego. Oznacza to, że uzyskasz szalenie różne wyniki na urządzeniu i symulatorze - nie jest to dobre. W każdym razie główny katalog sandbox nie jest taki sam, jak folder zasobów pakietu. –

2

Można spróbować tego pliku

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

tutaj zakładając jest w pulpit.

+2

Jest to dopuszczalne i pomocne w przypadku tymczasowego rusztowania. –

+0

Używam absolutnej ścieżki pliku, jest to pomocne dla mnie. – tomfriwel

31

Jeśli chcesz uzyskać URL z drogi (powiedzmy, ponieważ został utworzony plik w NSTemporaryDirectory() i trzeba się, że jako adres URL) można łatwo zrobić za pomocą bibliotece NSURL za fileURLWithPath metody:

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

Znacznie łatwiej niż + URLWithString: i inne metody.

+4

To jest właściwa droga, '+ fileURLWithPath:' PUMP UP! –

1

Swift 3:

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