如何使用Swift在iOS开发中实现"缓存"

And*_*kas 2 caching core-data ios nscache swift3

我在面向iOS应用程序实现的缓存机制方面遇到了一些问题.首先,让我解释一下我的情况.

我想通过我的服务器上的RESTful API使用Alamofire请求数千个附近的位置记录(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.

 ]
Run Code Online (Sandbox Code Playgroud)

关键是我只想在应用程序启动时或经过一定时间后或应用程序用户大幅移动他/她的位置时发送/重新发送此查询,这也会改变附近的位置.为了保持服务器负载较低,我计划对应用程序内部的返回位置进行搜索查询,而不是为每个请求查询服务器,这实际上是低效且昂贵的.

因此,我想在手机上缓存我的响应数据,但我不知道选择哪个选项.我在CoreDataNSCache上做了一些背景阅读.CoreData允许我将位置结果存储在数据库中.这样做的好处是存储的记录在内部保持活跃,因为它毕竟是永久存储解决方案.另一方面,使用CoreData可能是一个完全的过度杀伤,因为它带来了开销,使用NSCache将位置记录保存在缓存中可能不会占用太多内存(记住我只存储字符串).但话说回来,为什么当用户甚至不经常访问它们时,将位置数据保留在缓存中.此外,有可能释放缓存中的位置条目以节省更多内存.

我相信还有其他解决方案可能更适合我的目的.毕竟,我对iOS中的这个主题很新,所以我真的很感激一些指导.

先感谢您.

Rya*_* H. 18

考虑到CoreData和NSCache,您正走在正确的轨道上.

会有权衡.在减少网络活动时,您将寻求利用设备内存和/或文件系统.应仔细考虑使用这些资源.下面的所有选项都是可行的,用仪器进行一些测量可能是值得的,以了解每种方法的影响.

在纸上这里是我如何根据您的要求权衡它们.

NSCache

优点

  • 简单的API,实现的努力程度很低
  • 容易推理

缺点

  • 如果您需要的数据不再缓存,则必须触发另一个网络请求.也就是说,您可以实现NSCacheDelegate并在"对象即将被逐出或从缓存中删除时"进行响应.请参阅NSCacheDelegate

核心数据

优点

  • 可以用作内存存储(不仅仅是将数据保存到磁盘)
  • 可以扩展以适应更复杂的数据建模,查询和存储要求
  • 有Xcode工具支持

缺点

  • 最初,它需要比其他选项更多的努力来实现
  • 正如Duncan C所提到的,有一个学习曲线
  • 添加另一个抽象,可能需要更多的思考,而不是NSCache或plist

文件系统(plist或其他格式)

优点

  • 努力实施
  • 容易推理

缺点

  • 介绍文件系统I/O操作.从性能的角度来看,如果有其他选择,这是不可取的.
  • 不容易扩展(如果您的需求发生变化)


Dun*_*n C 5

您所展示的是一系列字典。

如果您正在缓存的数据变化不大,并且当它发生变化时整个事情都会发生变化,那么您实际上并不需要 SQL 数据库。

您可以使用该NSArray方法简单地将数组保存到 plist 文件func write(toFile:atomically:)

如果您将数组写入文档目录,则它不会消失。如果您将其写入缓存目录,则稍后可能会刷新它。

它的优点是非常简单。它的缺点是它不适合更新某些内容而不是其他内容。您保存整个内容,然后加载整个内容。对于 10,000 条纯文本记录,将整个内容加载到内存中并不是什么大问题。如果每个大小为 250 字节,则略小于 2.5 MB - 非常合理。

Core Data 非常强大,但也非常复杂,并且具有陡峭的学习曲线。需要一段时间来了解如何使用它。