请教 iOS app REST api 缓存方案。

2014-11-07 17:01:34 +08:00
 jianzong
这几天在研究,app通过restful的http请求从服务器获取数据,并且缓存到本地。

譬如没有网络的时候,都能够打开手机app看到团购券。

然后下拉刷新可以获取新数据。发现有几种方案:

1. 自己手写保存、读取core data;
2. 使用restKit(https://github.com/RestKit/RestKit);
3. AFIncrementalStore;
4. NSURLCache。

reddit亦有相关讨论:
http://www.reddit.com/r/iOSProgramming/comments/263nbi/ios7_rest_api_coredata_best_practices_and/

不知道哪种方案比较理想,所以请教下大家。
9625 次点击
所在节点    iDev
23 条回复
cdffh
2014-11-07 17:20:22 +08:00
android同求。现在是在本地放了一个sqllite数据库,做数据同步。两套数据读取逻辑蛋疼。
jseanj
2014-11-07 17:25:08 +08:00
RestKit包含一整套方案,从数据请求,映射,存储,如果app不大会有些重。主要看你app的数据量级别。
xudshen
2014-11-07 17:27:01 +08:00
@cdffh android端我自己写了一套统一的接口,
给本地的数据加缓存时间,优先读取本地,缓存过期就拉远程;
另外接口加一个强制拉远程的字段,用于手动刷新
bzmario
2014-11-07 17:28:02 +08:00
xudshen
2014-11-07 17:30:32 +08:00
@xudshen 现在存在的问题是:有些缓存生命周期仅仅在APP运行时有效,之前单单用的缓存过期时间不能解决这种情况
kinoAndWorld
2014-11-07 17:33:13 +08:00
碰到熟人纯支持→_→

可以先选成本最小的一种,用一段时间试试。
毕竟实践是检验真理的唯一标准嘛
txx
2014-11-07 17:43:33 +08:00
iOS: 我用的 Leveldb

@cdffh Android 可以用 Volley 自帶緩存...
jianzong
2014-11-07 18:14:22 +08:00
@cdffh 之前的项目用core data也是自己写一套同步逻辑,多了很多dummy代码。
jianzong
2014-11-07 18:14:40 +08:00
@jseanj 正在研究下restkit
jianzong
2014-11-07 18:15:17 +08:00
@bzmario 谢谢,reddit上也有人提过mantle,研究下
jianzong
2014-11-07 18:15:39 +08:00
@txx thanks
jianzong
2014-11-07 18:16:26 +08:00
@kinoAndWorld 是的,储存、网络交互分层的话,以后更换的代价也比较小。现在主要想找个比较合适的方案开始。
seathink
2014-11-08 14:43:37 +08:00
@cdffh Android使用Retrofit配合okhttp使用,解析/缓存 非常好用
yellowV2ex
2014-11-09 10:31:47 +08:00
我是把网址和参数组成一个key,然后把读到的内容value存进去,读的时候先读上次缓存的结果,同步读取网络,如果有不同则立即更新界面,因为是统一接口,所以全局网络读取都自动有了缓存机制。
jianzong
2014-11-09 10:37:47 +08:00
@yellowV2ex 这个方法好!简单易用,很合适!
errun
2014-11-14 15:35:20 +08:00
@yellowV2ex 你好,请问你这个方案中,缓存是用什么做的呢?
yellowV2ex
2014-11-14 18:15:51 +08:00
@errun 离线或网路不好的时候,打开起码有点东西看,一直显示个loading觉得不是很友好,当然,你也可以设置时间,比如3天后才再去读取网络。
总好过每次打开就去请求才有内容看。
yellowV2ex
2014-11-14 18:32:41 +08:00
@errun 不好意思,我看成你问 缓存是做什么用的。。。

我之前本来是自己写了一个,但多个项目改来改去加了好多没用的东西,想重写的时候看到这个 http://blog.devtang.com/blog/2014/10/03/opensouce-a-key-value-storage-tool/ 就用了这个。

大概就是一个key,存到本地的sqlite里,升级应用也不会丢失,因为只有key和value还有时间,你可以把key的名字稍微起的复杂些方便检索,再加上分开不同的表,基本满足大部分日常应用了。

其实也不一定用sqlite,随便什么能存个key和内容就可以了
zsk425
2014-11-28 10:47:26 +08:00
我也一直在关注这个问题,不知道缓存是否可以完全依赖HTTP机制,仅用NSURLCache搞定。有没有同学了解这个?
jianzong
2014-11-28 14:03:25 +08:00
@zsk425 可以,经过这个问题的讨论和我后来的研究,分享一下:

通过NSCache可以解决大部分缓存问题,因为必须由服务器来决定资源的缓存时间。
怎样设计良好的Restful api,涉及REST的基础原理以及不同资源的缓存机制,强烈建议阅读。
http://blog.mugunthkumar.com/articles/restful-api-server-doing-it-the-right-way-part-1/

客户端使用afnetworking的话,图片资源自动使用NSCache进行缓存,其他资源也容易配置,客户端可以参考这篇文章:
http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/

需要注意的是,要调用NSCache,服务器必须返回cache-control header,来让NSCache决定缓存多久。

恰好我现在做的app用到七牛的cdn,七牛返回的请求已经配置了cache-control header,所以ios端我使用UIImageView + AFNetworking,图片就自动缓存了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/144736

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX