The URL loading system provides a composite on-disk and in-memory cache of responses to requests. This cache allows an application to reduce its dependency on a network connection and increase its performance.
An NSURLRequest instance specifies how the local cache is used by setting the cache policy to one of the NSURLRequestCachePolicy
values: NSURLRequestUseProtocolCachePolicy
, NSURLRequestReloadIgnoringCacheData
, NSURLRequestReturnCacheDataElseLoad
, or NSURLRequestReturnCacheDataDontLoad
.
The default cache policy for an NSURLRequest instance is NSURLRequestUseProtocolCachePolicy
. The NSURLRequestUseProtocolCachePolicy
behavior is protocol specific and is defined as being the best conforming policy for the protocol.
Setting the cache policy to NSURLRequestReloadIgnoringCacheData
causes the URL loading system to load the data from the originating source, ignoring the cache completely.
The NSURLRequestReturnCacheDataElseLoad
cache policy will cause the URL loading system to use cached data ignoring its age or expiration date, if it exists, and load the data from the originating source only if there is no cached version.
The NSURLRequestReturnCacheDataDontLoad
policy allows an application to specify that only data in the cache should be returned. Attempting to create an NSURLConnection or NSURLDownload instance with this cache policy returns nil
immediately if the response is not in the local cache. This is similar in function to an “offline” mode and never brings up a network connection.
Note: Currently, only responses to http
and https
requests are cached. The ftp
and file
protocols attempt to access the originating source as allowed by the cache policy. Custom NSURLProtocol classes can provide caching if they choose.
The most complicated cache use situation is when a request uses the http
protocol and has set the cache policy to NSURLRequestUseProtocolCachePolicy
.
If an NSCachedURLResponse does not exist for the request, then the data is fetched from the originating source. If there is a cached response for the request, the URL loading system checks the response to determine if it specifies that the contents must be revalidated. If the contents must be revalidated a connection is made to the originating source to see if it has changed. If it has not changed, then the response is returned from the local cache. If it has changed, the data is fetched from the originating source.
If the cached response doesn’t specify that the contents must be revalidated, the maximum age or expiration specified in the response is examined. If the cached response is recent enough, then the response is returned from the local cache. If the response is determined to be stale, the originating source is checked for newer data. If newer data is available, the data is fetched from the originating source, otherwise it is returned from the cache.
RFC 2616, Section 13 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13) specifies the semantics involved in detail.
Last updated: 2010-03-24