离线缓存实现的技术手段有很多,可能你会想到用coredata(本人没有用过), sqlite,或是归档。也有可能你会想到用字典,url路径做KEY, value存文件的file路径。这次我要介绍一种比较简单并且实用的离线缓存技术。就是通过NSURLCache实现离线缓存。就是当我们网络请求失败时 我们可以通过NSURLCache这个对象,去搜索我们手机本地的是否已经存储了数据。如果有缓存则取出。
NSURLCache离线缓存实现我总结起来就两步。
第一部.NSURLCache初始化操纵。
NSURLCache *cache = [NSURLCache sharedURLCache]; //这里是获取全局NSURLCache对象;
[cache setDiskCapacity:10*1024*1024];
上面这一语句是设置数据可以缓存的容量,这里喔设置的是10M。意思是我们在进行网络请求时会将网络请求来的数据存在bundle里,当网络请求存储的数据超过10M时, 时间比较久的数据就会被删除。
PS:NSURLCache初始化操纵,我的建议是在程序了入口,也就是 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions)这个函数里进行初始化。
------------------------------------------------------------------------
第二部.当我们网络请求失败时我们通过NSURLCache这个对象,取出缓存数据。这里我用AFNetwork做例子讲解。
AFHTTPRequestOperationManager *mgr=[AFHTTPRequestOperationManager manager];
[mgr GET:@"URL路径" parameters:@"参赛" success:^(AFHTTPRequestOperation *operation, id responseObject) {
//当有网络时,访问服务器成功,这是我们希望的
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//当无网络时,访问服务器失败, 这时我们就访问本地,看是否有缓存
NSURLCache *cache=[NSURLCache sharedURLCache];
NSURLRequest *request=operation.request;
//下面这句是关键,我们通过请求体request, 获得响应体,响应体里就存着,我们缓存的数据了
NSCachedURLResponse *response=[cache cachedResponseForRequest:request];
NSData *data=response.data;
cachedResponseForRequest:这个函数就是通过request,查找数据库,再把数据库缓存的数据提取出来。 你可能会疑惑为什么通过request就能从数据库查找到是否有缓存数据呢? 这里你可以把request理解为数据库的主键,可能你会说主键必须要是唯一的,我们怎么判定request是否唯一。 request里面有url路径,请问url路径是唯一 的吗? 这里其实和我上面说的离线缓存通过字典实现是一个道理的.
}];
上面我介绍了NSURLCache离线缓存的简单实现,总结起来就一句话:当没有网络时通过NSURLRequest对象获取缓存数据。
//NSURLCache 移除所有缓存
[self.cache removeAllCachedResponses];
//NSURLCache 移除某个特定的混存
[self.cache removeCachedResponseForRequest:request;