我在面向iOS应用程序实现的缓存机制方面遇到了一些问题。首先,让我们解释一下我的情况。
我想使用 Alamofire 通过我的服务器上的RESTful API请求数千个附近位置记录(10000或更多),其中每个记录由一串字符串组成。 JSON响应格式与此类似:
[
{
"id": 1,
"name": "Name x",
"lat": 59.5025878,
"lng": -0.1509515,
"address": "Address x"
},
{
"id": 2,
"name": "Name y",
"lat": 61.5025878,
"lng": -0.1508515,
"address": "Address y"
},
etc.
]
关键是我只想在应用程序启动时或经过一段时间后或者app用户大幅移动他/她的位置时发送/重新发送此查询,这也会改变附近的位置。为了保持较低的服务器负载,我计划对应用程序内部的返回位置进行搜索查询,而不是为每个请求查询服务器,这样做效率非常低且成本高。
因此,我想在手机上缓存我的回复数据,但我不知道应该选择哪种方式。我对 CoreData 和 NSCache 进行了一些背景阅读。 CoreData允许我将位置结果存储在数据库中。这样做的好处是存储的记录在内部保持活跃,因为它毕竟是永久存储解决方案。另一方面,使用CoreData可能是一个完全的过度杀伤,因为它带来了开销,使用 NSCache 将位置记录保存在缓存中可能不会占用太多内存(请记住我只存储字符串)。但话说回来,为什么当用户甚至不经常访问它们时,将位置数据保留在缓存中。此外,有可能释放缓存中的位置条目以节省更多内存。
我相信还有其他解决方案可能更适合我的目的。毕竟,我对iOS中的这个主题很新,所以我真的很感激一些指导。
提前谢谢。
答案 0 :(得分:14)
考虑到CoreData和NSCache,你走在正确的轨道上。
会有权衡。在减少网络活动时,您将寻求利用设备内存和/或文件系统。应仔细考虑使用这些资源。以下所有选项都是可行的,用仪器进行一些测量可能是值得的,以了解每种方法的影响。
在纸面上,我可以根据您的要求权衡它们。
<强>赞成强>
<强>缺点强>
<强>赞成强>
<强>缺点强>
<强>赞成强>
<强>缺点强>
答案 1 :(得分:3)
你所展示的是一系列词典。
如果您正在缓存的数据没有那么大的变化,并且当它发生变化时,整个过程发生了变化,那么您实际上并不需要SQL数据库。
您可以使用NSArray
方法func write(toFile:atomically:)
如果将数组写入文档目录,那么它就不会消失。如果将其写入caches目录,则可以在以后刷新它。
它具有污垢简单的优点。它的缺点是它不能更新某些内容而不能更新其他内容。你保存整个东西,然后加载整个东西。将整个内容加载到内存中对于10,000个纯文本记录来说并不是什么大问题。如果每个250字节,那就小于2.5 MB - 非常合理。
核心数据非常强大,但也非常复杂,并且具有陡峭的学习曲线。我们需要一段时间来探讨如何使用它。