2011-10-31 29 views
7

Tôi biết ơn vì bài báo Convert NSData bytes to NSString?, đặc biệt là cho @ christo16. Trước đây tôi đã phụ thuộc vào ASIHttpRequest chỉ để lấy giá trị từ máy chủ PHP. Bây giờ chỉ sử dụng dòng mã này:Tại sao dữ liệu NSDataWithContentsOfURL đôi khi trả về giá trị NULL?

NSString *pageContents = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"http://www.apple.com"]] 

Tôi có thể có được chức năng mình muốn.

Nhưng tại sao đôi khi nguyên nhân dòng trangContent là NULL. Tôi đã thay đổi dòng này thành:

NSString *fullUrl = [NSString stringWithFormat:@"http://www.apple.com"]; 
NSURL *url = [[NSURL alloc] initWithString:fullUrl]; 
NSData *pageContents; 
NSString *response = NULL; 

while(response==NULL) 
{ 
    pageContents = [NSData dataWithContentsOfURL: [NSURL URLWithString:fullUrl]]; 
    response = [NSString stringWithUTF8String:[pageContents bytes]]; 
    NSLog(@"content = %@", response); 
} 

Có cách nào tốt hơn để làm việc này không? Cho đến bây giờ, tôi không có vấn đề gì. Tôi chỉ tự hỏi liệu có một cách thanh lịch hơn để đạt được kết quả tương tự

Cảm ơn

+1

Nhược điểm của một lớp lót đó là nó chặn giao diện người dùng của bạn, có thể trong một thời gian dài. Vòng lặp thậm chí còn tồi tệ hơn: nếu máy chủ không phản hồi các kết nối, thì nó sẽ chặn giao diện người dùng hiệu quả mãi mãi (cho đến khi SpringBoard bị chán và giết chết quá trình của bạn). –

Trả lời

18

Nó sẽ trở lại nil nếu có một lỗi khi truy xuất dữ liệu.

Bạn có thể sử dụng thông báo dataWithContentsOfURL:options:error: để tìm hiểu lý do tại sao thư trả lại là không. Lỗi sẽ được trả về trong con trỏ NSError* mà bạn vượt qua.

+0

cảm ơn @Brigham cho thông tin đó. Nhưng, vấn đề là, đôi khi nó không có, đôi khi không. Vì vậy, tôi chỉ cần ép nó để thử nó cho đến khi nó không phải là null. Nếu sử dụng dataWithContentsOfURL: options: error, bạn xử lý như thế nào? – swdev

+1

@swdev: Bạn nhìn vào lỗi để tìm hiểu những gì đã xảy ra và phản ứng phù hợp với những gì đã xảy ra. Thông thường, điều này sẽ trình bày lỗi cho người dùng. –

1

Có thể ảnh quá lớn hoặc url không chính xác.

NSError* error = nil; 
NSData* data = [NSData dataWithContentsOfURL:yourURL options:NSDataReadingUncached error:&error]; 
if (error) { 
    NSLog(@"%@", [error localizedDescription]); 
} else { 
    NSLog(@"Data has loaded successfully."); 
} 
0

kiểm tra kết nối mạng của bạn. Nếu nó được kết nối thì vấn đề sẽ giải quyết.

Các vấn đề liên quan