在 iPhone OS 上,苹果出于未知原因移除了对磁盘缓存的在线支持。有些人说这是为了节省闪存驱动器的寿命,而有些人则认为这是为了节省磁盘容量。正如在 NSURLCacheStoragePolicy 中所述,NSURLCacheStorageAllowed 常量始终被视为 NSURLCacheStorageAllowedInMemoryOnly,而且无法强制恢复,因此在该平台上的代码肯定已经不存在了。无论出于什么原因苹果移除了这个功能,您可能对在您的应用程序中具有磁盘 HTTP 请求缓存感兴趣。SDURLCache 会为您恢复 iPhone OS 的这一功能。
要使用它,您只需创建一个实例,将其与默认的共享 NSURLCache 替换,然后即可,您立即为您的应用程序赋予了磁盘 HTTP 请求缓存能力。
SDURLCache *urlCache = [[SDURLCache alloc] initWithMemoryCapacity:1024*1024 // 1MB mem cache
diskCapacity:1024*1024*5 // 5MB disk cache
diskPath:[SDURLCache defaultCachePath]];
[NSURLCache setSharedURLCache:urlCache];
[urlCache release];
为了节省闪存驱动器,SDURLCache 默认情况下不会对缓存过期时间小于 5 分钟的磁盘上的响应进行缓存。您可以更改此行为,方法是更改 minCacheInterval
属性。
当磁盘容量达到时,在周期性维护线程中自动执行缓存清除。所有磁盘写操作都在单独的线程中执行,因此它们不会阻塞主运行循环。
要控制缓存行为,请使用 NSURLRequest
的 cachePolicy
属性。如果您希望响应不被缓存到磁盘但仍然在内存中,您可以实现 NSURLConnection
的 connection:willCacheResponse:
代理方法,并将 NSURLCachedResponse
的 storagePolicy
属性更改为 NSURLCacheStorageAllowedInMemoryOnly
。以下是一个示例
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
NSCachedURLResponse *memOnlyCachedResponse =
[[NSCachedURLResponse alloc] initWithResponse:cachedResponse.response
data:cachedResponse.data
userInfo:cachedResponse.userInfo
storagePolicy:NSURLCacheStorageAllowedInMemoryOnly];
return [memOnlyCachedResponse autorelease];
}