【进阶篇】如何优雅的设计coredata的离线缓存策略

关乎到用户体验,离线缓存在一个完善成熟的App架构中,似乎成了不可或缺的部分,本地数据加载的零延迟,能给用户带来更好的使用体验。
在使用离线缓存数据时,第一个需要考虑的是<code>数据的实时性</code>,
数据的实时性对于不同的App或者不同的信息类型,都会有不一样的要求,数据的实时性可以用来划分不同的场景或者使用离线缓存的策略:

1、<code>数据实时性要求高:</code>这类信息数据变化频繁,需要客户端与服务器的数据保持高度统一,这种情况下总是优先去请求网络数据。

注意:

因为这类数据通常<code>“过期”</code>会带来比较大的危险,所有如果显示了本地数据,应禁用对应的数据操作功能,并提示警告信息。

image1

2、<code>数据实时性要求不高:</code>数据在服务器的变化不会很频繁,客户端可以优先使用本地缓存数据,让用户去选择是否加载新的数据。通常这类数据在本地存在的时间越长,离线缓存的优势就越明显。

image2

3、<code>权衡利弊:</code>在一开始定好规则,在适当的时机或条件下,智能的去决定优先使用哪方面的数据。

image3
思考:

关于这一块,不同的业务场景,业务需求,数据显示逻辑,面对的可能都不一样,所有还是需要在实际的开发中去拿捏分寸,巧妙的将数据存在本地,而又避免“过期数据”带来的危险。

扯了这么多,如何使用coredata来做到这些事情呢?(这特么才是重点好么~)

前面已经写了两篇关于coredata的简单使用和coredata数据迁移的文章,现在就来谈谈如何进阶使用吧。

1、封装:

数据操作无非增删改查,这些方法必须进行封装,那么封装在哪呢?我们需要一个所有实体的基类:

<pre>
<code class='objc hljs'>

/**

  • 实体基类
    */
    @interface BaseEtt : NSManagedObject

//获取类名
+(NSString*)className;

//创建一个新的实体
+(BaseEtt*) createEntity;

//根据where条件查询实体
+(NSArray) selectEntityWithWhere:(NSString) where;

/**

  • 根据条件升序查询
  • @param where 条件
  • @param key 排序字段
  • @return
    /
    +(NSArray
    ) selectEntityWithWhere:(NSString) where byAsc:(NSString )key;
    /
  • 根据条件降序查询
  • @param where 条件
  • @param key 排序字段
  • @return
    /
    +(NSArray
    ) selectEntityWithWhere:(NSString*) where byDesc:(NSString *)key;

/**

  • 根据条件分页查询
  • @param page 页码
  • @param where 条件
  • @return
    /
    +(NSArray
    ) getListByPage:(PageInfo)page where:(NSString)where;

/**

  • 保存实体

/
+(void) saveEntity;
/
*

  • 删除实体
  • @param entity
    /
    +(void) removeEntity:(BaseEtt
    ) entity;
    /**
  • 删除所有实体
    /
    +(void) removeAll;
    /
    *
  • 按条件删除实体
  • @param where
    /
    +(void) removeWithWhere:(NSString
    ) where;
    /**
  • 按条件删除实体保存
  • @param where
  • @param save
    /
    +(void) removeWithWhere:(NSString
    ) where SaveContext:(BOOL) save;

/**

  • 判断两个实体是否相等
  • @param entity 对比实体
  • @return 是否相等
    /
    -(BOOL) isEqualToEntity:(BaseEtt
    ) entity;
    @end
    </code></pre>

这里包含了常用的增删该查的方法,一般在手机端所需要的数据查询并不会怎么复杂,这些基本都能够满足日常使用,新建的实体继承这个基类,这样就可以很方便的使用这些方法了。

<code>isEqualToEntity</code>这个方法是用来比较服务器获取数据转化为实体后是否与本地的实体对象是否相等,所以需要在所有继承它的子类进行重写,至于条件的话,可以根据实际情况进行扩展,一般都是使用xxID之类的字段。

<code>PageInfo</code>是一个分页对象,里面就两个属性,一个<code>PageIndex</code>,一个<code>PageSize</code>

2、判断

这些数据大致会在三个地方:

1、<code>dataArray</code>(当前页面显示数据存放的数组)

2、<code>tempArray</code>(从服务器获取数据的临时存放数组)

3、<code>localDB</code>(本地数据库)

注:

这里不得不提的一点是,<code>coredata</code>是一个对象关系映射的数据持久化框架,它的实体对象是互相影响的,也可以说其实就是一个,所以<code>dataArray</code>的数据和<code>localDB</code>中的数据可以看成是一样的,<code>dataArray</code>只是拿了<code>localDB</code>一部分而已.

我模拟了以下几个常用的场景:

1、进入页面请求服务器数据,成功后的与本地数据的对比判断:

image4
image4

2、上拉加载更多数据(分页)


image5

其它的判断场景大致都差不多,只需要注意:

1、不要添加重复数据到本地,这将可能会导致数据错乱

2、如果业务需要,一定要存储多条相同的数据在本地,那么要记得用不同的标记来区分,并且<code> isEqualToEntity </code>的重写应该要把这个标记的判断加进去。

3、一定要理解对象关系映射(ORM)的数据状态,注意实体对象的引用(例如:上级页面用到这某个对象,在下级页面将这个对象进行了remove,即使在你看来这是两个不同的对象了,也是会导致上个页面报空指针的异常)。

3、说点其它的:

其实标题中的优雅二字在我写完后发现并不合适,在写博客的过程中,有些之前没想到的东西突然也变得豁然开朗,不过还是不得不说一句,coredata的水比较深,慎入!!!(开玩笑)

附上github地址:<i class="am-icon-github"></i>coreDataTools

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,595评论 4 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 朱尼:一所创建学院的高等生。在朱华石发明“时空穿越机”后,因好奇心穿越到早人期,遇到三只眼人——奇奇。和他成为了好...
    李程昱阅读 509评论 0 1
  • 今天我写这篇文章,并不是说我在创作上已经取得了很大的成就,有很多宝贵的经验可以分享,传授。绝对不是这么一回事,这种...
    笑笑竹笋妹阅读 996评论 0 1