IOS简单的离线缓存实现

 离线缓存实现的技术手段有很多,可能你会想到用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路径是唯一 的吗?  这里其实和我上面说的离线缓存通过字典实现是一个道理的.

}];    

IOS简单的离线缓存实现_第1张图片


上面我介绍了NSURLCache离线缓存的简单实现,总结起来就一句话:当没有网络时通过NSURLRequest对象获取缓存数据。


 //NSURLCache 移除所有缓存
    [self.cache removeAllCachedResponses];
     //NSURLCache 移除某个特定的混存
    [self.cache removeCachedResponseForRequest:request;

IOS简单的离线缓存实现_第2张图片

你可能感兴趣的:(IOS,离线缓存,ios,缓存)