2010-08-23 21 views
8

Dữ liệu NSData +WithContentsOfURL có bất kỳ loại bộ nhớ đệm nào theo mặc định? Có ai đã thử nghiệm một số loại sự cố khi sử dụng phương pháp này hay không, cách hiệu quả nhất để lấy Dữ liệu từ web là gì?Dữ liệu NSDataWithContentsOfURL cache

Trả lời

3

Tài liệu không nói rằng nó sẽ lưu vào bộ nhớ cache, vì vậy tôi nghĩ chúng ta nên giả định rằng chúng không thực hiện bất kỳ bộ nhớ đệm nào.

Những loại dữ liệu mà bạn muốn để có được

UIImage: yes, tôi nghĩ rằng bạn nên sử dụng NSData

Video: bạn nên sử dụng MPMoviePlayerController cho streaming

Text: Tôi nghĩ rằng bạn có thể làm bình thường NSUrlConnection. Nó cũng có đồng bộ, đồng bộ và lưu vào bộ nhớ đệm

+0

Tôi cần lấy tệp cấu hình ở định dạng XML, tôi nên sử dụng NSUrlConnection, phải không? – cesarnicola

+0

Vâng, tôi nghĩ bạn nên sử dụng NSUrlConnection và thực hiện asyncrhonous để ngăn chặn việc chặn giao diện người dùng – vodkhang

8

Sử dụng ASIHTTPRequest. Đó là thư viện máy khách HTTP của bên thứ ba làm cho tương tác mạng MUCH đơn giản hơn và có các chức năng bộ nhớ đệm rất đẹp.

CẬP NHẬT: Chỉ cần có một câu trả lời cho câu trả lời này, đây là lời nhắc tốt để quay lại và cập nhật. Lot đã thay đổi kể từ tháng 8 '10. Đáng chú ý nhất: ASIHTTPRequest hiện không được chấp nhận và tác giả của nó khuyến khích mọi người sử dụng cái gì khác. AFNetworking có vẻ là một lựa chọn phổ biến.

+1

Đã thay thế bản ghi chú của tôi bằng ghi chú. Không có gì cá nhân, rõ ràng, tôi chỉ không muốn mọi người nghĩ rằng đó vẫn là một câu trả lời hay. Làm việc tốt trên bản cập nhật. :) –

+0

@StevenFisher - Số lượng địa điểm trong lịch sử SO của tôi, nơi tôi chân thành khuyên bạn nên ASIHTTPRequest là đáng kinh ngạc. Tôi đang đếm ngược về việc giúp tôi tìm tất cả! –

+0

Bạn có thể muốn cân nhắc xóa câu trả lời, ít nhất là trong ngữ cảnh này ... Tôi không nghĩ bạn phải quay lại tất cả mọi thứ. –

5

Tốt nhất bạn nên sử dụng NSURLConnection. NSURLRequest bạn cung cấp cho nó có thể được cấu hình để làm bộ nhớ đệm theo cách bạn muốn nhưng theo mặc định nó sẽ chỉ làm bộ nhớ đệm tiêu chuẩn của các tài nguyên HTTP có các tiêu đề thích hợp trong phản hồi của chúng.

Đây là những gì tôi làm:

NSData *data = [NSURLConnection sendSynchronousRequest: 
       [NSURLRequest requestWithURL:url] 
            returningResponse:nil 
               error:&error]; 

Hãy chắc chắn để đặt điều này trong một NSOperationQueue đó không phải là hàng đợi chính của bạn hoặc off-load nó từ chủ đề chính trong một số cách khác, mặc dù. Ngoài ra, hãy sử dụng yêu cầu không đồng bộ.

+1

Điều này làm việc cho tôi. – razorhead

-1

nếu những gì bạn cần chỉ là tải xuống hình ảnh từ url, đừng bận tâm sử dụng bất kỳ thư viện nào, chỉ cần một lệnh dispatch_async đơn giản là OK. như thế này:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) 
{ 
    NSData * data = [NSData dataWithContentsOfURL:imageUrl]; 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     self.image = [UIImage imageWithData:data]; 
    }); 
}); 
+1

Sự cố là hình ảnh không được lưu vào bộ nhớ cache vì vậy phương pháp này là mạng nặng nếu cùng một hình ảnh được sử dụng lại ở nhiều nơi. –

5

Có vẻ như trên iPhone5s chính sách mặc định là cache (unlinke iPhone5 trở về trước).

Bạn có thể xử lý thông qua tùy chọn tham số chính sách bộ nhớ cache cho NSData. Ví dụ: nếu bạn muốn tránh bộ nhớ cache, bạn có thể sử dụng chế độ ẩn sau:

[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url] options:NSDataReadingUncached error:nil]; 
Các vấn đề liên quan