2009-08-26 52 views

Trả lời

13

Cách dễ dàng là sử dụng các phương pháp tiện lợi của NSData initWithContentOfURL:writeToFile:atomically: để lấy dữ liệu và viết ra tương ứng. Hãy ghi nhớ điều này là đồng bộ và sẽ chặn bất kỳ chủ đề bạn thực hiện nó cho đến khi lấy và viết hoàn tất.

Ví dụ:

// Create and escape the URL for the fetch 
NSString *URLString = @"http://example.com/example.png"; 
NSURL *URL = [NSURL URLWithString: 
       [URLString stringByAddingPercentEscapesUsingEncoding: 
          NSASCIIStringEncoding]]; 

// Do the fetch - blocks! 
NSData *imageData = [NSData dataWithContentsOfURL:URL]; 
if(imageData == nil) { 
    // Error - handle appropriately 
} 

// Do the write 
NSString *filePath = [[self documentsDirectory] 
         stringByAppendingPathComponent:@"image.png"]; 
[imageData writeToFile:filePath atomically:YES];

Trường hợp phương pháp documentsDirectory bị đánh cắp trắng trợn từ this question:

- (NSString *)documentsDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    return [paths objectAtIndex:0]; 
}

Tuy nhiên, trừ khi bạn có ý định cho chủ đề đó cho mình này sẽ ngừng hoạt động giao diện người dùng trong lúc tải file. Thay vào đó, bạn có thể muốn nhìn vào NSURLConnection và ủy nhiệm của nó - nó tải xuống dưới nền và thông báo cho một đại biểu về dữ liệu được tải xuống một cách không đồng bộ, vì vậy bạn có thể xây dựng một thể hiện của NSMutableData sau đó chỉ ghi nó ra khi kết nối được thực hiện. ủy quyền của bạn có thể chứa các phương pháp như:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the data to some preexisting @property NSMutableData *dataAccumulator; 
    [self.dataAccumulator appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Do the write 
    NSString *filePath = [[self documentsDirectory] 
          stringByAppendingPathComponent:@"image.png"]; 
    [imageData writeToFile:filePath atomically:YES]; 
}

Các chi tiết nhỏ, như tuyên bố dataAccumulator và xử lý sai sót, để lại cho người đọc :)

Các tài liệu quan trọng:

+0

Cảm ơn ! Ummm ... Đồng bộ? Điều này có nghĩa là tôi đã sử dụng tốt hơn "bánh xe/thanh tiến trình" trong khi công việc đang được thực hiện? – RexOnRoids

+2

Đồng bộ nghĩa là tất cả hoạt động trong chương trình của bạn (tốt, chủ đề chính) sẽ dừng hoàn toàn cho đến khi quá trình tải xuống hoàn tất. Điều này có nghĩa là giao diện người dùng sẽ bị đóng băng cho người dùng và người quay phim thậm chí sẽ không bắt đầu hoạt ảnh cho đến khi quá trình tải xuống hoàn tất (hiển thị chúng hoàn toàn vô ích). Phương pháp thứ hai, tải xuống không đồng bộ, cho phép chương trình của bạn tiếp tục hoạt động ở nền trước trong khi tải xuống dưới nền. Dù bằng cách nào, có, bạn nên sử dụng một số loại chỉ số tiến bộ. – Tim

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