我正在开发由Core Data支持的应用程序。 现在,当我在Context中添加或删除实体时,我正在保存对象上下文。 我担心它会影响性能,所以我想延迟保存。 事实上,我可以一直延迟它直到应用程序终止。 仅在应用程序即将关闭时保存数据是否风险太大?我应该多久调用一次对象上下文的保存?
我正在考虑让一个单独的线程处理保存:它将等待信号量。每次应用程序的任何部分调用helper / util方法来保存Core Data时,它都会减少信号量。当它降到零时,“保存线程”将执行一次保存并将信号量增加到a,比如说5,然后再次休眠。
有什么好建议吗? 谢谢!
答案 0 :(得分:10)
你应该经常保存。保存操作的实际性能与您正在使用的持久性存储类型有很大关系。由于二进制和XML存储是原子的,因此需要在每次保存时将它们完全重写为磁盘。随着对象图的增长,这可能会使您的应用程序变慢。另一方面,SQLite存储更容易逐步写入。因此,虽然会有一些东西写在你正在保存的对象之上和之外,但开销远远低于原子存储类型。无论整体对象图的大小如何,保存仅影响少数几个对象的速度总是很快。
也就是说,如果你在一个循环中导入数据,比方说,我会等到完成操作结束后才能保存而不是保存每次迭代。您的主要目标应该是防止数据丢失。 (我发现用户并不关心这一点!)性能应该紧随其后。您可能需要做一些工作来平衡保存与性能的频率,但除非您已经确定了特定且重要的性能问题,否则您在上面概述的解决方案似乎有些过分。
答案 1 :(得分:0)
我认为最好的方法是在每个物体之后保存。如果发生突然崩溃等事情,将不会丢失任何东西。
如果添加大量对象,一些性能增强是批量处理。将所有对象添加到上下文而不是保存。例如,如果在循环中添加批次对象,则这很好。你的想法很相似,但是在保存之间可能会有很长的时间,程序可能会崩溃。
我不认为添加单个对象会是一个很大的性能问题。你的对象有多大,它们是否包含大量数据?
答案 2 :(得分:0)
其他答案中未提及的一个问题是,涉及使用后台线程的解决方案不应在另一个线程中使用的托管对象上下文上运行。通常,您会为后台线程创建一个新的MOC,但是如果保存到其他/未修改的后台MOC,那将失去保存的目的。
您的问题的几个答案:
您真的希望尽快保存,因此至少我的建议是节制而不是任意设置任何计时器或倒计时。