2011-08-23 28 views
9

Mặc dù tài liệu của Apple indicating otherwise, NSURLCache trên iOS không làm bất kỳ bộ nhớ đệm (flash) nào cả. Bạn có thể phân lớp NSURLCache để thay đổi hành vi tìm nạp và lưu trữ hoạt động để sử dụng đĩa (như SDURLCache), nhưng do những hạn chế nghiêm trọng sau đây về cách sử dụng và triển khai bộ nhớ cache, điều này không hoạt động tốt như bạn ' d mong đợi:NSURLConnection trên iOS không cố gắng lưu vào bộ nhớ cache đối tượng lớn hơn 50KB

  • NSURLConnection thậm chí không gọi storeCachedResponse:forRequest: cho các tệp trên khoảng 50KB (> = 52428 byte, chính xác). Điều này làm cho việc phân lớp NSURLCache vô nghĩa đối với việc sử dụng chúng tôi (hình ảnh 200KB), bởi vì nó thậm chí sẽ không truy cập vào bộ nhớ cache. Do đó, chúng tôi phải thêm bộ nhớ đệm theo cách thủ công ở cấp độ trên NSURLConnection.
  • Ngay cả khi một cuộc gọi được tích hợp sẵn của NSURLCache storeCachedResponse:forRequest: theo cách thủ công, nó chỉ lưu trữ phản hồi trong bộ nhớ nếu nó nhỏ hơn khoảng 180KB. Tôi đã thử nghiệm điều này bằng cách gọi storeCachedResponse theo cách thủ công và thấy rằng trước/sau currentMemoryUsage không thay đổi cho độ dài dữ liệu trên khoảng 180KB. Vì vậy, chúng tôi cũng phải viết bộ nhớ đệm LRU của riêng mình.

Có ai khác nhận thấy những vấn đề này không? Hay có điều gì đó tôi đang thiếu?

FYI, tôi đang chạy iOS 4.3 trong mô phỏng và trên iPad 2.

Trả lời

1

tôi muốn đề nghị sử dụng các thư viện và three20 TTURLRequest. Điều này dường như có bộ nhớ đệm tốt cho các kích thước dữ liệu lớn, vì nó được sử dụng cho Facebook và đặc biệt là các hình ảnh.

TTURLRequest là khá nhiều sự sụt giảm thay thế cho một NSURLRequest, vì vậy nên dễ dàng di chuyển đến, và không có nhiều sự phụ thuộc vào phần còn lại của three20

2

Tôi không chắc chắn làm thế nào nó làm việc cho một UIWebvieuw, nhưng khi bạn sử dụng một NSURLRequest kích thước tối đa của tập tin phụ thuộc về cách bạn khởi tạo URLCache (initWithMemoryCapacity: (NSUInteger) memoryCapacity ...)

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