繁体   English   中英

我应该多久保存一次Core Data?

[英]How often should I save to Core Data?

我正在开发一个由Core Data支持的应用程序。 现在,当我在Context中添加或删除实体时,我正在保存对象上下文。 我担心它会影响性能,所以我想延迟保存。 事实上,我可以一直延迟它直到应用程序终止。 仅在应用程序即将关闭时保存数据是否风险太大? 我应该多久调用一次对象上下文的保存?

我想有一个单独的线程处理保存:它将等待信号量。 每次应用程序的任何部分调用helper / util方法来保存Core Data时,它都会减少信号量。 当它降到零时,“保存线程”将执行一次保存,并将信号量增加到a,比如5,然后再次休眠。

有什么好建议吗? 谢谢!

你应该经常保存。 保存操作的实际性能与您正在使用的持久性存储类型有很大关系。 由于二进制和XML存储是原子的,因此需要在每次保存时将它们完全重写为磁盘。 随着对象图的增长,这可能会使您的应用程序变慢。 另一方面,SQLite存储更容易逐步写入。 因此,虽然会有一些东西写在你正在保存的对象之上和之外,但开销远远低于原子存储类型。 无论整体对象图形大小如何,保存仅影响少数对象的速度总是很快。

也就是说,如果您在循环中导入数据,比方说,我会等到完成操作结束后才能保存而不是保存每次迭代。 您的主要目标应该是防止数据丢失。 (我发现用户并不关心这一点!)性能应该紧随其后。 您可能需要做一些工作来平衡保存与性能的频率,但除非您已经确定了特定且重要的性能问题,否则您在上面概述的解决方案似乎有些过分。

我认为最好的方法是在每个对象之后保存。 如果发生突然崩溃等事情,将不会丢失任何东西。

如果添加大量对象,一些性能增强是批量处理。 将所有对象添加到上下文而不是保存。 例如,如果在循环中添加批次对象,则这很好。 你的想法很相似,但是在保存之间可能需要很长时间,程序可能会崩溃。

我不认为添加单个对象会是一个很大的性能问题。 你的对象有多大,它们包含大量数据吗?

其他答案中未提及的一个问题是,您的解决方案(涉及使用后台线程)不应在另一个线程中使用的托管对象上下文上运行。 通常,您为后台线程创建一个新的MOC,但如果您保存到不同/未修改的背景MOC,则会失败保存的目的。

所以你的问题有几个答案:

  1. 您需要回调原始线程以保存MOC
  2. 由于目前接受的答案表明,除非衡量绩效问题,否则整个计数器可能对您的需求而言过度。
  3. 如果测量了性能问题,您可以采用简单的限制技术,例如,每10秒设置一次限制。 存储上次保存的日期。 当你的保存功能被调用时,请确保自上次保存以来当前时间> 10秒,否则提前返回。

你真的希望尽可能地立即保存,所以至少我的建议是节流而不是任意设置任何计时器或倒计时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM