2011-02-10 47 views
45

Tôi đang cố gắng truy cập vào kho lưu trữ tệp XML trong thư mục tài nguyên. Tôi đang sử dụng NSURL để truy cập tệp này bằng NSURLConnection (tệp này sẽ được hoán đổi cho một dịch vụ từ xa trong tương lai).Truy cập tệp cục bộ bằng 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"); 
} 

Lớp bắt đầu kết nối thực hiện các phương pháp NSURLConnection:

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

Khi tôi khởi động này mô phỏng chết, không có tin nhắn được in ra cửa sổ Console vì vậy tôi đang ở một mất mát cho nơi để xem xét . Bất kỳ ý tưởng, hoặc tôi chỉ làm điều này hoàn toàn sai?

Trả lời

17

Điều này cũng sẽ làm việc:

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

Hope this helps !

+1

Phần này cung cấp đường dẫn hệ thống tệp chứ không phải URL. Tôi không hiểu tại sao, nhưng OP muốn tải XML của anh ấy từ URL. Có thể để chuyển dễ dàng hơn sang các nguồn dựa trên web ... –

+0

Tất nhiên. Cảm ơn Seva - bạn thực sự là chính xác! –

+9

Mặc dù câu trả lời của tôi đã được đánh dấu là câu trả lời chính xác, tôi tin rằng câu trả lời từ Seva thực sự là chính xác! Điều này có thể được cập nhật không? –

152

Cố tải bất kỳ thứ gì từ hệ thống tập tin root là sai, sai, sai. Chắc chắn sai trên thiết bị, và có lẽ sai trên giả lập. Thư mục tài nguyên nên được truy cập thông qua lớp NSBundle.

Ví dụ, để có được một URL cho một tập tin gọi là "data.txt" trong các nguồn lực, sử dụng như sau:

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

Đồng ý. Đây là cách truy cập đúng thư mục tài nguyên! –

+2

Tôi đã bị ấn tượng '/' trên iOS truy cập vào root sandbox ứng dụng, tôi có thể dễ dàng bị sai. Đây là mã tôi đã sử dụng để có được url, ứng dụng vẫn thổi lên, nhưng điều này có vẻ như một động thái thông minh hơn nhiều. 'NSURL * url = [[NSBundle mainBundle] URLForResource: @" XMLTest "withExtension: @" xml "];' – botptr

+1

Trên trình mô phỏng, có vẻ như,/có nghĩa là máy chủ chủ. Có nghĩa là bạn sẽ nhận được kết quả cực kỳ khác nhau trên thiết bị và trên trình mô phỏng - không tốt. Và dù sao, thư mục gốc sandbox không giống với thư mục tài nguyên bó. –

2

Bạn có thể thử tập tin này

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

đây giả định là trong máy tính để bàn.

+2

Điều này có thể chấp nhận và hữu ích cho giàn giáo tạm thời. –

+0

Tôi sử dụng đường dẫn tuyệt đối của tệp, điều này rất hữu ích đối với tôi. – tomfriwel

31

Nếu bạn muốn có được một URL từ một đường dẫn (chẳng hạn, bởi vì bạn đã tạo một tập tin trong NSTemporaryDirectory() và bạn cần phải nhận được rằng dưới dạng URL), bạn có thể dễ dàng thực hiện bằng cách sử dụng phương pháp fileURLWithPath NSURL của:

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

Dễ dàng hơn nhiều so với + URLWithString: và các phương pháp khác.

+4

Đây là cách đúng, '+ fileURLWithPath:' PUMP UP! –

1

Swift 3:

let myFileName = "somefilename" 
    let myURL = Bundle.main.url(forResource: myFileName, withExtension: "png") 
Các vấn đề liên quan