专栏首页ShaoYLiOS---数据离线缓存

iOS---数据离线缓存

离线缓存

  • 为了用户的体验,不需要每次打开App都加载新数据,或者重新请求数据,因此需要把每次浏览的数据保存起来,当下次打开软件时,首先从沙盒中加载数据;或者当软件未联网时,也只能从沙盒中加载旧数据。

离线数据的方法选择

  • 1.plist文件
  • 2.Document路径
  • 3.数据库
由于保存的是大批量数据,且会不停的刷新新数据,因此应该选择数据库来存储。

离线缓存的思路

  • 当第一次打开应用程序时,把界面加载好的数据保存到沙盒中
  • 当下一次进入应用程序时,首先从沙盒中找
    • 如果没有网络,直接加载上次保存的数据,或者没有比较新的数据也从沙盒中加载数据。

需要缓存的数据如何保存

  • sqlite3 框架FMDB

操作数据库的工具类

static FMDatabase *_db;
+ (void)initialize
{
    // 1.打开数据库
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"statuses.sqlite"];
    _db = [FMDatabase databaseWithPath:path];
    [_db open];
    
    // 2.创表
    // 表中有三列,一个是主键,另一个是数据对象的id,一个是数据对象
    [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_status (id integer PRIMARY KEY, status blob NOT NULL, idstr text NOT NULL);"];
}
保存到沙盒中得数据库中
+ (void)saveStatuses:(NSArray *)statuses
{
    // statuses是字典数组
    // 要将一个对象存进数据库的blob字段,最好先转为NSData
    // 一个对象要遵守NSCoding协议,实现协议中相应的方法,才能转成NSData
    for (NSDictionary *status in statuses) {
        // NSDictionary --> NSData
        NSData *statusData = [NSKeyedArchiver archivedDataWithRootObject:status];
        [_db executeUpdateWithFormat:@"INSERT INTO t_status(status, idstr) VALUES (%@, %@);", statusData, status[@"idstr"]];
    }
}
从数据库中取出缓存数据
+ (NSArray *)statusesWithParams:(NSDictionary *)params
{
    // 根据请求参数生成对应的查询SQL语句
    NSString *sql = nil;
    // params[@"since_id"] 上拉刷新的标识
    if (params[@"since_id"]) {
        sql = [NSString stringWithFormat:@"SELECT * FROM t_status WHERE idstr > %@ ORDER BY idstr DESC LIMIT 20;", params[@"since_id"]];
    } else if (params[@"max_id"]) { // 下拉刷新
        sql = [NSString stringWithFormat:@"SELECT * FROM t_status WHERE idstr <= %@ ORDER BY idstr DESC LIMIT 20;", params[@"max_id"]];
    } else { // 第一次加载的时候
        sql = @"SELECT * FROM t_status ORDER BY idstr DESC LIMIT 20;";
    }
    
    // 执行SQL
    FMResultSet *set = [_db executeQuery:sql];
    NSMutableArray *statuses = [NSMutableArray array];
    while (set.next) {
        NSData *statusData = [set objectForColumnName:@"status"];
        NSDictionary *status = [NSKeyedUnarchiver unarchiveObjectWithData:statusData];
        [statuses addObject:status];
    }
    return statuses;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 区块链:定义未来金融与经济新格局

    用户1941540
  • OC语言Block

    用户1941540
  • Protocol(协议)

    用户1941540
  • 聊聊flink的NetworkEnvironmentConfiguration

    本文主要研究一下flink的NetworkEnvironmentConfiguration

    codecraft
  • 使用Nginx的Rtmp模块搭建一个流式媒体(直播)服务器并用Node.JS实现实时评论

    近期在家里闲着没事干,然后和群员聊着聊着,突然想起了之前想要搭建的流式媒体服务器,但是没有搭建成功。然而在这个超长的寒假中,我成功实现了(后来发现很简单)

    iVampireSP.com
  • MySQL 状态变量(Server Status Variables)

        MySQL状态变量是当前服务器自启动后累计的一些系统状态信息,主要用于评估当前系统资源的使用情况以进一步分析系统性能而做出相应的调整决策。这些状态变量我...

    Leshami
  • [WebKit] JavaScriptCore解析--基础篇(一)字节码的生成及抽象语法树的构建详情分析

    看到HorkeyChen写的文章《[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现》,写的很好,深...

    程序员互动联盟
  • 第十四届华中科技大学程序设计竞赛 C.Professional Manager(并查集操作)

           题目链接:https://www.nowcoder.com/acm/contest/106/C

    Ch_Zaqdt
  • error while loading shared libraries libaio.so.1

    当我们使用“mysql_install_db”安装MySQL时,需要libaio包,现将不同Linux系统安装该包的方式总结如下:

    九州暮云
  • CNN—pooling层的作用

    此处是个人见解:欢迎微信探讨:lp5319 1、使构建更深层次的网络变得可行; 2、使得filters获得更多的全局和contextual(上下文)信息; 3、...

    MachineLP

扫码关注云+社区

领取腾讯云代金券