请教 iOS app REST api 缓存方案。 - V2EX
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 10343 次点击
    这是一个创建于 3992 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这几天在研究,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的数据量级别。
    ozking
        3
    ozking  
       2014-11-07 17:27:01 +08:00
    @cdffh android端我自己写了一套统一的接口,
    给本地的数据加缓存时间,优先读取本地,缓存过期就拉远程;
    另外接口加一个强制拉远程的字段,用于手动刷新
        4
    bzmario  
       2014-11-07 17:28:02 +08:00
    ozking
        5
    ozking  
       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天后才再去读取网络。
    总好过每次打开就去请求才有内容看。
    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     Solana     2492 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 15:28 PVG 23:28 LAX 08:28 JFK 11:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86