2009-03-21 24 views
7

Tôi đang gặp sự cố nhỏ với yêu cầu lưu bộ nhớ đệm bằng cách sử dụng kết nối không đồng bộ NSURLConnection trên iPhone. Tôi không biết nếu tôi hiểu một cái gì đó không đúng cách, hoặc nếu Cocoa đang làm điều ngược lại với những gì nó phải làm ...NSURLConnection, NSURLYêu cầu và bộ nhớ đệm từ xa

Các tài liệu cho NSURLRequest nói rằng:

NSURLRequestReloadIgnoringLocalCacheData

Chỉ định dữ liệu cho tải URL phải được tải từ nguồn gốc. Không có dữ liệu bộ nhớ cache hiện có nào được sử dụng để đáp ứng yêu cầu tải URL.

và:

NSURLRequestReloadIgnoringLocalAndRemoteCacheData

Chỉ định rằng không chỉ cần các dữ liệu bộ nhớ cache cục bộ được bỏ qua, nhưng điều đó proxy và trung gian khác cần được hướng dẫn để bỏ qua bộ nhớ đệm của họ cho đến nay là giao thức cho phép .

Bây giờ, nếu tôi gửi một NSURLRequest với NSURLRequestReloadIgnoringLocalCacheData (được cho là bỏ qua bộ nhớ cache của địa phương, nhưng sử dụng bộ nhớ cache từ xa nếu có), các tiêu đề được gửi là:

 
GET /dashboard HTTP/1.1 
User-Agent: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1) 
X-Blip-Api: 0.02 
Accept: application/json 
Authorization: Basic (...) 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Host: api.blip.pl 

Và tình trạng này là 200 OK. Nhưng nếu tôi sử dụng NSURLRequestReloadIgnoringLocalAndRemoteCacheData, mà là vụ phải bỏ qua cache cả hai địa phương và từ xa, như tên cho thấy, một trong những tiêu đề bổ sung thêm:

 
If-None-Match: "d751713988987e9331980363e24189ce" 

Và câu trả lời là 304 Not Modified. Tôi đã kiểm tra HTTP RFC và cho "If-None-Match", nó cho biết:

Nếu bất kỳ thẻ thực thể nào phù hợp với thẻ thực thể của đối tượng sẽ được trả về trong phản hồi yêu cầu GET tương tự (không có tiêu đề If-None-Match) trên tài nguyên đó, (...) thì máy chủ PHẢI KHÔNG thực hiện phương thức được yêu cầu (...) Thay vào đó, nếu phương thức yêu cầu là GET hoặc HEAD, máy chủ NÊN đáp ứng với một phản ứng (Không thay đổi) 304

Vì vậy, có vẻ như nếu tôi sử dụng NSURLRequestReloadIgnoringLocalAndRemoteCacheData, thay vì bỏ qua bộ nhớ cache từ xa, Cocoa nói với máy chủ từ xa một cách rõ ràng rằng nó nên sử dụng bộ nhớ đệm từ xa, và nếu tôi sử dụng NSURLRequestReloadIgnoringLocalCacheData, nó không thêm dòng đó và có hiệu lực bộ nhớ cache từ xa không được sử dụng.

Vậy chính xác những gì đang xảy ra ở đây? Tôi đã bỏ lỡ một cái gì đó, hoặc là Cocoa thiết lập một tiêu đề sai?

Trả lời

2

Bằng cách thêm tham số NSURLRequestReloadIgnoringLocalAndRemoteCacheData bạn đang hướng dẫn bộ nhớ cache cục bộ và bất kỳ máy chủ proxy nào có thể xử lý yêu cầu giữa máy khách và máy chủ mục tiêu của bạn mà chúng không trả về phiên bản dữ liệu phản hồi của riêng chúng. Tôi nghĩ thành phần quan trọng ở đây là RemoteCache có khả năng là proxy và bạn chỉ xác định rằng yêu cầu luôn luôn đến được máy chủ thực và không phải là bản sao proxy.

Thêm tham số "ngu ngốc-dài tên" mà bạn đoán rằng ứng dụng của bạn đã có bản sao yêu cầu trước đó và vì vậy chỉ quan tâm đến việc thực sự nhận dữ liệu từ máy chủ nếu nó đã thay đổi, đó là lý do bạn nhận được phản hồi của "304 Not Modified" từ máy chủ.

Hành vi này có vẻ phản trực giác vì bạn đang hướng dẫn khách hàng không sử dụng bộ nhớ cache của riêng mình, điều này có nghĩa là bạn muốn loại bỏ bất kỳ thứ gì trong đó và chắc chắn không sử dụng nó làm tham chiếu cho bất kỳ yêu cầu tiếp theo nào. Tôi tin rằng các thông số bộ nhớ cache nâng cao được cung cấp để cho phép nhà phát triển xử lý mức bộ nhớ đệm của riêng họ, ví dụ: được thông báo nếu dữ liệu chưa được cập nhật trên máy chủ để chúng có thể tránh được việc xử lý lại không cần thiết.

1

Lưu ý "proxy và các trung gian khác" một phần. Bạn chỉ tránh các cache không nằm trên máy chủ gốc. Các máy chủ ban đầu vẫn có thể trở lại một 304.

10

Từ các tài liệu:

Chỉ định rằng không chỉ cần các dữ liệu bộ nhớ cache cục bộ được bỏ qua, nhưng điều đó proxy và trung gian khác cần được hướng dẫn để bỏ qua bộ nhớ đệm của họ cho đến nay như giao thức cho phép.

Từ NSURLRequest.h (10,5 SDK)

Chỉ định rằng không chỉ cần các dữ liệu bộ nhớ cache cục bộ được bỏ qua, nhưng điều đó proxy và trung gian khác cần được hướng dẫn để bỏ qua bộ nhớ đệm của họ cho đến nay là giao thức cho phép. Chưa thực hiện.

Chú ý sự khác biệt: chưa thực hiện

Thời gian để báo cáo lỗi ...

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