如何在 iOS 开发中使用 Swift 处理 'caching'
How to approach 'caching' in iOS development with Swift
我在为 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.
]
关键是我只想在应用程序启动时或经过一定时间后或应用程序用户大幅移动 his/her 位置时 send/resend 此查询,它也会更改附近的位置。为了保持低服务器负载,我计划在应用程序内对返回的位置进行搜索查询,而不是为每个请求查询服务器,这将是非常低效和昂贵的。
因此,我想在 phone 上缓存我的响应数据,但我不知道该选择哪个选项。我对 CoreData 和 NSCache 做了一些背景阅读。 CoreData 允许我将位置结果存储在数据库中。这样做的好处是存储的记录在内部保持活动状态,因为它毕竟是一个永久存储解决方案。另一方面,使用 CoreData 可能完全矫枉过正,因为它会带来开销,并且使用 NSCache 将位置记录保存在缓存中可能不会使用太多内存(记住我只存储字符串).但话又说回来,当用户甚至可能不会经常访问它们时,为什么还要将位置数据保存在缓存中。此外,还有可能释放缓存中的位置条目以节省更多内存。
我相信还有其他解决方案甚至可能更适合我的目的。毕竟,我在 iOS 中对这个话题还很陌生,因此非常感谢您的指导。
提前致谢。
您显示的是一组字典。
如果您缓存的数据变化不大,而当它发生变化时,整个事情都会发生变化,那么您真的不需要 SQL 数据库。
您可以使用 NSArray
方法 func write(toFile:atomically:)
将数组简单地保存到 plist 文件
如果您将数组写入文档目录,那么它不会消失。如果您将它写入缓存目录,那么它可能会在稍后刷新。
它的优点是非常简单。它的缺点是它不适合更新某些内容而不适合更新其他内容。你保存整个东西,然后你加载整个东西。将整个内容加载到内存中对于 10,000 条纯文本记录来说并不是什么大问题。如果每个为 250 字节,则略小于 2.5 MB - 相当合理。
Core Data 非常强大,但也非常复杂,并且学习曲线陡峭。您需要花一些时间来思考如何使用它。
考虑到 CoreData 和 NSCache,您走在正确的轨道上。
会有取舍。在减少网络 activity 时,您将寻求利用设备内存 and/or 文件系统。应仔细考虑使用任何这些资源。以下所有选项都是可行的,可能值得使用仪器进行一些测量以查看每种方法的影响。
在纸面上,根据您的要求,我将如何权衡它们。
NSCache
优点
- 简单 API,实施起来不费力
- 容易推理
缺点
- 如果您需要的数据不再被缓存,那么您将不得不触发另一个网络请求。也就是说,您可以实现 NSCacheDelegate 并在“对象即将被逐出或从缓存中删除”时做出响应。见 NSCacheDelegate
核心数据
优点
- 可以用作内存存储(不仅用于将数据持久化到
磁盘)
- 可以扩展以适应更复杂的数据建模、查询和
存储要求
- 有 Xcode 工具支持
缺点
- 最初它比其他选项需要更多的努力来实施
- 正如 Duncan C 所说,有一个学习曲线
- 添加另一个抽象,可能需要比 NSCache 或 plist 更多思考
文件系统(plist 或其他格式)
优点
- 实施工作量小
- 容易推理
缺点
- 引入文件系统I/O操作。从性能的角度来看,如果有其他选择,这是不可取的。
- 不易扩展(如果您的需求发生变化)
我在为 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.
]
关键是我只想在应用程序启动时或经过一定时间后或应用程序用户大幅移动 his/her 位置时 send/resend 此查询,它也会更改附近的位置。为了保持低服务器负载,我计划在应用程序内对返回的位置进行搜索查询,而不是为每个请求查询服务器,这将是非常低效和昂贵的。
因此,我想在 phone 上缓存我的响应数据,但我不知道该选择哪个选项。我对 CoreData 和 NSCache 做了一些背景阅读。 CoreData 允许我将位置结果存储在数据库中。这样做的好处是存储的记录在内部保持活动状态,因为它毕竟是一个永久存储解决方案。另一方面,使用 CoreData 可能完全矫枉过正,因为它会带来开销,并且使用 NSCache 将位置记录保存在缓存中可能不会使用太多内存(记住我只存储字符串).但话又说回来,当用户甚至可能不会经常访问它们时,为什么还要将位置数据保存在缓存中。此外,还有可能释放缓存中的位置条目以节省更多内存。
我相信还有其他解决方案甚至可能更适合我的目的。毕竟,我在 iOS 中对这个话题还很陌生,因此非常感谢您的指导。
提前致谢。
您显示的是一组字典。
如果您缓存的数据变化不大,而当它发生变化时,整个事情都会发生变化,那么您真的不需要 SQL 数据库。
您可以使用 NSArray
方法 func write(toFile:atomically:)
如果您将数组写入文档目录,那么它不会消失。如果您将它写入缓存目录,那么它可能会在稍后刷新。
它的优点是非常简单。它的缺点是它不适合更新某些内容而不适合更新其他内容。你保存整个东西,然后你加载整个东西。将整个内容加载到内存中对于 10,000 条纯文本记录来说并不是什么大问题。如果每个为 250 字节,则略小于 2.5 MB - 相当合理。
Core Data 非常强大,但也非常复杂,并且学习曲线陡峭。您需要花一些时间来思考如何使用它。
考虑到 CoreData 和 NSCache,您走在正确的轨道上。
会有取舍。在减少网络 activity 时,您将寻求利用设备内存 and/or 文件系统。应仔细考虑使用任何这些资源。以下所有选项都是可行的,可能值得使用仪器进行一些测量以查看每种方法的影响。
在纸面上,根据您的要求,我将如何权衡它们。
NSCache
优点
- 简单 API,实施起来不费力
- 容易推理
缺点
- 如果您需要的数据不再被缓存,那么您将不得不触发另一个网络请求。也就是说,您可以实现 NSCacheDelegate 并在“对象即将被逐出或从缓存中删除”时做出响应。见 NSCacheDelegate
核心数据
优点
- 可以用作内存存储(不仅用于将数据持久化到 磁盘)
- 可以扩展以适应更复杂的数据建模、查询和 存储要求
- 有 Xcode 工具支持
缺点
- 最初它比其他选项需要更多的努力来实施
- 正如 Duncan C 所说,有一个学习曲线
- 添加另一个抽象,可能需要比 NSCache 或 plist 更多思考
文件系统(plist 或其他格式)
优点
- 实施工作量小
- 容易推理
缺点
- 引入文件系统I/O操作。从性能的角度来看,如果有其他选择,这是不可取的。
- 不易扩展(如果您的需求发生变化)