2012-04-13 39 views
7

Tôi đang sử dụng NSURLRequest để kiểm tra các bản cập nhật dữ liệu có sẵn. Hôm nay tôi nhận thấy rằng NSURLRequest lưu trữ yêu cầu theo mặc định. Ngay cả sau vài giờ không có yêu cầu mới nào được gửi đến máy chủ. Bây giờ tôi tự hỏi hành vi mặc định của cache này là gì. Khi nào dữ liệu được lưu trong bộ nhớ cache sẽ cũ và yêu cầu mới gửi đến máy chủ? Các dữ liệu là một tập tin tĩnh và máy chủ không gửi rõ ràng tiêu đề kiểm soát bộ nhớ cache:Thời gian hết hạn bộ nhớ cache mặc định cho NSURLRequests là gì?

HTTP/1.1 200 OK
Date: Fri, 13 Apr 2012 08:51:13 GMT
Server: Apache
Last-Modified: Thu, 12 Apr 2012 14:02:17 GMT
ETag: "2852a-64-4bd7bcdba2c40"
Accept-Ranges: bytes
Content-Length: 100
Vary: Accept-Encoding,User-Agent
Content-Type: text/plain

PS: Phiên bản mới của ứng dụng của tôi đặt ra một chính sách rõ ràng bộ nhớ đệm, do đó đây không phải là một vấn đề nữa nhưng tôi tò mò về hành vi mặc định là gì.

Trả lời

0

Nó được sử dụng để thực hiện một yêu cầu mới sau khi tôi khởi động lại ứng dụng của mình. Bằng cách khởi động lại, tôi làm điều đó bằng cách nhấn nút home hai lần hiển thị danh sách các ứng dụng đang chạy, giết ứng dụng của tôi và khởi động lại bằng cách nhấp vào biểu tượng ứng dụng.

Cũng có thể vô hiệu hóa bộ nhớ đệm nếu bạn muốn. ghi đè phương pháp này của ủy quyền NSURLProtocol

// vô hiệu hóa bộ nhớ đệm vì tệp của chúng tôi được lưu trữ trong nhiều máy chủ và bộ nhớ đệm phản hồi sai có thể gây ra sự cố.

-(NSCachedURLResponse *)connection:(NSURLConnection *)connection 
       willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 
    NSCachedURLResponse *newCachedResponse = cachedResponse; 

    //if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) 
    { 
     newCachedResponse = nil; 
    } 
    return newCachedResponse; 
} 
+0

Tôi biết cách giải quyết vấn đề này. Tôi đã đề cập, rằng tôi đặt chính sách bộ nhớ đệm rõ ràng trong phiên bản mới của ứng dụng của tôi. Vì vậy, vấn đề thực tế được giải quyết. Tôi chỉ tò mò về hành vi mặc định. – henrik

+0

cool .. my answer cũng là một FYI :) – Naresh

+0

Tôi chỉ dựa trên câu trả lời trên callbacks của tôi, Nếu tôi nhìn vào nhật ký của tôi applicationWIllTerminate được gọi bất cứ khi nào tôi làm một loại bỏ khỏi danh sách đa nhiệm, đó là lý do tại sao tôi tin nó cho nhà phát triển ứng dụng này nơi bạn cần xử lý mã thoát ứng dụng. Tôi muốn chỉ ra rằng bộ nhớ cache được làm mới sau khi ứng dụng được khởi chạy mới sau – Naresh

13

Lưu ý: here quy định cụ thể như thế nào điều này sẽ làm việc một cách chi tiết

  1. Nếu không có bộ nhớ cache sau đó lấy dữ liệu.

  2. Nếu có bộ nhớ cache, hãy kiểm tra sơ đồ tải

    a. nếu xác thực lại được chỉ định, hãy kiểm tra nguồn cho các thay đổi

    b. nếu xác thực lại không được chỉ định sau đó tìm nạp từ bộ đệm cục bộ theo 3)

  3. Nếu xác thực lại không được chỉ định, bộ nhớ cache cục bộ sẽ được kiểm tra để xem nó có đủ gần đây hay không.

    a. nếu bộ nhớ cache không cũ thì nó sẽ lấy dữ liệu từ bộ nhớ cache

    b. nếu dữ liệu là cũ thì nó lại xác nhận từ các nguồn

Từ here:

Chính sách bộ nhớ cache mặc định cho một thể hiện NSURLRequest là NSURLRequestUseProtocolCachePolicy. Các hành vi NSURLRequestUseProtocolCachePolicy là giao thức cụ thể và được định nghĩa như là chính sách Tuân thủ tốt nhất cho các giao thức

Từ here:

Nếu một NSCachedURLResponse không tồn tại cho các yêu cầu, sau đó dữ liệu được lấy từ nguồn gốc. Nếu có phản hồi được lưu trong bộ nhớ cache cho yêu cầu, URL tải hệ thống sẽ kiểm tra phản hồi để xác định xem nó có chỉ định nội dung phải được kiểm tra lại hay không.Nếu nội dung phải được xác nhận lại thì kết nối được thực hiện với nguồn gốc có nguồn gốc để xem nó có thay đổi hay không. Nếu nó không thay đổi, thì phản hồi được trả về từ bộ nhớ cache cục bộ. Nếu nó đã thay đổi, dữ liệu được lấy từ nguồn gốc.

Nếu phản hồi được lưu trong bộ nhớ cache không chỉ định rằng nội dung phải được xác thực lại, tối đa tuổi hoặc hết hạn được chỉ định trong phản hồi sẽ được kiểm tra. Nếu đáp ứng được lưu trong bộ nhớ cache gần đây là đủ, thì phản hồi sẽ được trả về từ bộ nhớ cache cục bộ. Nếu phản hồi được xác định là cũ, nguồn gốc được kiểm tra cho dữ liệu mới hơn. Nếu dữ liệu mới hơn là có sẵn, dữ liệu được tìm nạp từ nguồn gốc, nếu không dữ liệu được trả về từ bộ nhớ cache.

Các tùy chọn khác được liệt kê here.

+1

Cảm ơn câu trả lời của bạn. Tôi đã đọc tài liệu. Nó nói, rằng "hành vi là giao thức cụ thể". Bây giờ, nếu bây giờ thời gian hết hạn rõ ràng được thiết lập bởi máy chủ và không có hành vi cụ thể nào được cấu hình ở phía máy khách, sau thời gian nào NSUrlRequest sẽ gỡ bỏ các mục khỏi bộ nhớ cache? – henrik

+0

@henrik Trả lời cập nhật chi tiết hơn – mydogisbox

+0

Theo như tôi có thể nói, NSUrlCache không có giới hạn thời gian. Giới hạn thời gian được đặt bởi giao thức yêu cầu. Nếu giao thức không chỉ định một giao thức, có thể không có giao thức nào. – mydogisbox

0

Theo bài viết này: http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html, nếu bạn đang sử dụng NSURLRequestUseProtocolCachePolicy và máy chủ không trả lại hết hạn hoặc tối đa, khoảng thời gian bộ nhớ cache mặc định là 6 - 24 giờ. Vì vậy, hãy cẩn thận về tình trạng này. Thực hành tốt hơn là đặt độ tuổi tối đa hoặc hết hạn khi sử dụng NSURLRequestUseProtocolCachePolicy.

+0

Hiện tại, việc sử dụng NSURLRequestUseProtocolCachePolicy không tự động có nghĩa là một cái gì đó sẽ được lưu vào bộ nhớ cache, tôi đã thử nó một lúc trước. – David

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