• IOS缓存之PINCache的使用
  • 勇在天涯 发表于 2017/2/21 10:57:00 | 分类标签: IOS缓存 PINCache使用
  •  关于缓存

       无论是Android还是IOS都会使用到缓存,缓存的设计方案也大致雷同(内存缓存+磁盘缓存),内存缓存方面Android采用LinkedHashMap,IOS采用NSDictionary,两者都是基于Key-Value模型进行存储,磁盘缓存方面Android采用写文件,IOS这边采用归档操作本质是也是写文件。

    关于PINCache

       PINCache是Pinterest的程序员在Tumblr的TMCache基础上发展而来的,TMCache已经不再维护,PINCache主要的改进是修复了dealock的bug,是一个快速,无死锁的并行对象缓存,支持 iOS 和 OS X 系统。上面已经了解到PINCache分两层缓存(内存缓存+磁盘缓存),内部实现主要有两个类实现:PINMemoryCache、PINDiskCache,同时对两者提供了同步异步调用方式,由于磁盘缓存采用的是归档操作,所以对自定义的对象必须实现NSCoding协议,PINCache除了可以按键取值、按键存值、按键删值之外,还可以移除某个日期之前的缓存数据、删除所有缓存、限制缓存大小,限制缓存对象的存活时间等。接下来看下具体使用方式。

    PINCache使用

    同步方式

        //模拟数据
        NSString *value=@"who is lcj";
        //模拟一个key
        NSString *key=@"whoislcj";
        //sync 同步方式
        //写入缓存
        [[PINCache sharedCache] setObject:value forKey:key];
        
        //判断缓存是否存在
        BOOL containsObject =[[PINCache sharedCache] containsObjectForKey:key];
        NSLog(@"containsObject : %@", containsObject?@"YES":@"NO");
        
        //根据key读取数据
        id vuale=[[PINCache sharedCache] objectForKey:key];
        NSLog(@"value : %@",vuale);
        
        //根据key移除缓存
        [[PINCache sharedCache]removeObjectForKey:key];
        
        //移除所有缓存
        [[PINCache sharedCache]removeAllObjects];
        
        //根据截至日期 清除缓存
        [[PINCache sharedCache]trimToDate:[NSDate date]];

    异步方式

        //模拟数据
        NSString *value=@"who is lcj";
        //模拟一个key
        NSString *key=@"whoislcj";
        //async 异步方式
        //写入数据
        [[PINCache sharedCache] setObject:value forKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id  _Nullable object)    {
            NSLog(@"value : %@",object);
        }];
        
        //判断缓存是否存在
        [[PINCache sharedCache]containsObjectForKey:key block:^(BOOL containsObject) {
            NSLog(@"isContains : %@", containsObject?@"YES":@"NO");
        }];
        
        //根据key读取数据
        [[PINCache sharedCache]objectForKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id  _Nullable object) {
             NSLog(@"value : %@",object);
        }];
        
        //根据key移除缓存
        [[PINCache sharedCache]removeObjectForKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id  _Nullable object) {
             NSLog(@"value : %@",cache);
        }];
        
        //移除都有缓存
        [[PINCache sharedCache]removeAllObjects:^(PINCache * _Nonnull cache) {
             NSLog(@"value : %@",cache);
        }];
        
        //根据截至日期 清除缓存
        [[PINCache sharedCache]trimToDate:[NSDate date] block:^(PINCache * _Nonnull cache) {
            NSLog(@"value : %@",cache);
        }];
     PINCache使用起来还是非常容易的,当时我觉得美中不足的是PINCache没有实现动态清理机制,也就是LRU算法。

    总结:

       内部源码大致看了一遍,大致明白内部实现原理,由于理解不够深刻,就不对其源码进行分析了,大致了解一下具体使用方式,其实这次缓存技术选型对象是YYCache,本文对PINCache进行了解方便和YYCache做个大致对比。
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:勇在天涯
  • 加入时间:2013/5/15 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮