V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
jianzong
V2EX  ›  iDev

请教 iOS app REST api 缓存方案。

  •  
  •   jianzong ·
    haojianzong · 2014-11-07 17:01:34 +08:00 · 9844 次点击
    这是一个创建于 3669 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这几天在研究,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/

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

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

    @cdffh Android 可以用 Volley 自帶緩存...
    jianzong
        8
    jianzong  
    OP
       2014-11-07 18:14:22 +08:00
    @cdffh 之前的项目用core data也是自己写一套同步逻辑,多了很多dummy代码。
    jianzong
        9
    jianzong  
    OP
       2014-11-07 18:14:40 +08:00
    @jseanj 正在研究下restkit
    jianzong
        10
    jianzong  
    OP
       2014-11-07 18:15:17 +08:00
    @bzmario 谢谢,reddit上也有人提过mantle,研究下
    jianzong
        11
    jianzong  
    OP
       2014-11-07 18:15:39 +08:00
    @txx thanks
    jianzong
        12
    jianzong  
    OP
       2014-11-07 18:16:26 +08:00
    @kinoAndWorld 是的,储存、网络交互分层的话,以后更换的代价也比较小。现在主要想找个比较合适的方案开始。
    seathink
        13
    seathink  
       2014-11-08 14:43:37 +08:00 via Android
    @cdffh Android使用Retrofit配合okhttp使用,解析/缓存 非常好用
    yellowV2ex
        14
    yellowV2ex  
       2014-11-09 10:31:47 +08:00   ❤️ 1
    我是把网址和参数组成一个key,然后把读到的内容value存进去,读的时候先读上次缓存的结果,同步读取网络,如果有不同则立即更新界面,因为是统一接口,所以全局网络读取都自动有了缓存机制。
    jianzong
        15
    jianzong  
    OP
       2014-11-09 10:37:47 +08:00
    @yellowV2ex 这个方法好!简单易用,很合适!
    errun
        16
    errun  
       2014-11-14 15:35:20 +08:00
    @yellowV2ex 你好,请问你这个方案中,缓存是用什么做的呢?
    yellowV2ex
        17
    yellowV2ex  
       2014-11-14 18:15:51 +08:00
    @errun 离线或网路不好的时候,打开起码有点东西看,一直显示个loading觉得不是很友好,当然,你也可以设置时间,比如3天后才再去读取网络。
    总好过每次打开就去请求才有内容看。
    yellowV2ex
        18
    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
        19
    zsk425  
       2014-11-28 10:47:26 +08:00
    我也一直在关注这个问题,不知道缓存是否可以完全依赖HTTP机制,仅用NSURLCache搞定。有没有同学了解这个?
    jianzong
        20
    jianzong  
    OP
       2014-11-28 14:03:25 +08:00   ❤️ 1
    @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,图片就自动缓存了。
    zsk425
        21
    zsk425  
       2014-12-01 17:10:02 +08:00
    @jianzong 太感谢了,我去看看
    jianzong
        22
    jianzong  
    OP
       2014-12-15 21:35:29 +08:00
    写了一篇blog post来总结我的解决方案,有兴趣可以点来看,http://www.haojianzong.com/coding/ios/ios-cache.html
    foxling
        23
    foxling  
       2014-12-23 21:55:58 +08:00
    AFNetworking 自带缓存了,只不过你得使用适合的 NSURLRequestCachePolicy
    如果是图片的话,SDWebImage
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:17 · PVG 14:17 · LAX 22:17 · JFK 01:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.