一.单从拼写上来讲,两个东西很类似。事实是,这两个缓存没有任何联系。
二.NSURLCache提供的是URL Request缓存,可以在Memory和Disk上;NSCache提供了HTTP Request外的东西的缓存方式,在Memory上。NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容。AFNetworking的图片缓存采用的就是NSCache。
三.NSURLCache使用方式:
1.创建
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
2.缓存的几种方式
Constant | Meaning |
---|---|
UseProtocolCachePolicy | Default behavior |
ReloadIgnoringLocalCacheData | Don't use the cache |
ReturnCacheDataElseLoad | Use the cache (no matter how out of date), or if no cached response exists, load from the network |
ReturnCacheDataDontLoad | Offline mode: use the cache (no matter how out of date), but don't load from the network |
3.缓存实际在NSCachedURLResponse这个类中。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy];
NSMutableData *mutableData = [[cachedResponse data] mutableCopy];
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowedInMemoryOnly;
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response]
data:mutableData
userInfo:mutableUserInfo
storagePolicy:storagePolicy];
}
四.NSCache使用
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
myWidget = [[[Widget alloc] initExpensively] autorelease];
[myCache setObject: myWidget forKey: @"Important Widget"];
}
if (myWidget) {
[myWidget runOrWhatever];
}