iOS缓存策略

作者: LuisX | 来源:发表于2016-08-16 15:21 被阅读1130次
    iOS缓存策略

    一、思维脑图

    思维脑图

    思维脑图详情

    二、缓存思想

    • 数据库底层基于Sqlite。
    • 每个数据库表只有Key, Value两个字段。
    • 直接将JSON数据存储到Value中,并设置Key。
    • 通过Key查找对应Value数据,来进行数据增删改查操作,并更新视图。

    1.使用SDWebImage缓存图片。
    2.使用YTKKeyValueStore更方便使用FMDB。
    3.使用FMDB操作数据库。

    SDWebImage官方地址: https://github.com/rs/SDWebImage
    YTKKeyValueStore官方地址: https://github.com/yuantiku/YTKKeyValueStore
    FMDB官方地址: https://github.com/ccgus/fmdb


    三、使用YTKKeyValueStore操作数据库

    iOS端数据量不大,使用最简单直接的Key-Value存储就能带来开发上的效率优势。
    1.Model层的代码编写简单,易于测试。
    2.由于Value是JSON格式,所以在做Model字段更改时,易于扩展和兼容。

    • 简单使用
    //1.打开数据库(若有),创建数据库(若无)
    YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];
    //2.创建数据库表(若无),忽略(若无)
    NSString *tableName = @"user_table";
    [store createTableWithName:tableName];
    //3.写入数据
    NSString *key = @"1";
    NSDictionary *user = @{@"id": @1, @"name": @"tangqiao", @"age": @30};
    [store putObject:user withId:key intoTable:tableName];
    //4.读取数据
    NSDictionary *queryUser = [store getObjectById:key fromTable:tableName];
    NSLog(@"query data result: %@", queryUser);
    
    • 打开(创建)数据库

    默认创建在Document路径下。
    若打开的数据库不存在则创建。

    // 打开名为test.db的数据库,如果该文件不存在,则创新一个新的。
    YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];
    
    • 创建数据库表

    若创建的表存在则忽略。

    YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];
    NSString *tableName = @"user_table";
    // 创建名为user_table的表,如果已存在,则忽略该操作
    [store createTableWithName:tableName];
    
    • 读写数据

    通过Key-Value来读写数据库表中数据。
    Value支持类型:NSString, NSNumber, NSDictionary,NSArray。

    //写入数据
    - (void)putString:(NSString *)string withId:(NSString *)stringId intoTable:(NSString *)tableName;
    - (void)putNumber:(NSNumber *)number withId:(NSString *)numberId intoTable:(NSString *)tableName;
    - (void)putObject:(id)object withId:(NSString *)objectId intoTable:(NSString *)tableName;
    //读取数据
    - (NSString *)getStringById:(NSString *)stringId fromTable:(NSString *)tableName;
    - (NSNumber *)getNumberById:(NSString *)numberId fromTable:(NSString *)tableName;
    - (id)getObjectById:(NSString *)objectId fromTable:(NSString *)tableName;
    
    • 删除数据
    // 清除数据表中所有数据
    - (void)clearTable:(NSString *)tableName;
    // 删除指定key的数据
    - (void)deleteObjectById:(NSString *)objectId fromTable:(NSString *)tableName;
    // 批量删除一组key数组的数据
    - (void)deleteObjectsByIdArray:(NSArray *)objectIdArray fromTable:(NSString *)tableName;
    // 批量删除所有带指定前缀的数据
    - (void)deleteObjectsByIdPrefix:(NSString *)objectIdPrefix fromTable:(NSString *)tableName;
    
    • 其他

    YTKKeyValueItem类带有createdTime字段,可以获得该条数据的插入(或更新)时间,以便上层做复杂的处理(例如用来做缓存过期逻辑)。

    // 获得指定key的数据
    - (YTKKeyValueItem *)getYTKKeyValueItemById:(NSString *)objectId fromTable:(NSString *)tableName;
    // 获得所有数据
    - (NSArray *)getAllItemsFromTable:(NSString *)tableName;
    

    YTKKeyValueStore参考文档

    相关文章

      网友评论

      • 诸子百家谁的天下:我觉得可以参考下YYKit
      • winsonink:请问一下什么时候删除db中的数据呢,比如个人信息页面,数据缓存到db中,什么时候删除呢?就是缓存的更新或者失效策略一般都怎么订呢
        困惑困惑困惑:@winsonink 判断文件的大小
        winsonink:@LuisX 感谢回答,我就是不知道什么时候有网络更新,这个应该怎么去判断?比如,我缓存了我的朋友列表中的数据或者我的个人信息的数据在db中,朋友列表更新了,个人信息更新了,这个更新是怎么判断呢,是定期按时间吗,还是怎么?
        LuisX:@winsonink 你可以优先加载DB中的数据,有网络更新的时候去更新,主要针对数据变化不多的界面,如果是实时性的,或者变化比较频繁的没有必要去添加缓存机制

      本文标题:iOS缓存策略

      本文链接:https://www.haomeiwen.com/subject/lvupsttx.html