简单的并发核心数据

时间:2013-11-04 02:46:48

标签: ios objective-c core-data concurrency

过去几天我做了大量的研究,但我不确定当前最佳实践对于并发核心数据是什么。最相关的帖子似乎是这个blog post,但鉴于this analysis关于不同并发方法的性能,似乎父语境的现代方式可能不是最好的。另外,Apple的this example没有实现Apple's own concurrency guide中提到的最佳做法,建议不要使用默认的NSConfinementConcurrencyType。

鉴于所有这些,使用Core Data实现并发的最简单和最好的方法是什么?我只需要一个后台线程,在不挂断UI的情况下对Core Data进行一些长时间的写入操作。代码示例表示赞赏。

2 个答案:

答案 0 :(得分:0)

与往常一样,这实际上取决于您要完成的任务。

无论您实施的架构如何,“长写”都会挂起您的用户界面 写入操作将DB文件锁定在OS级别和sqlite引擎级别(如果使用此类存储),所有挂起的读取操作都必须等待写入结束才能完成。
最常用的优化方法之一是使用多个保存操作对数据库“加载”进程进行分段(您不应该介意这种情况会在后台发生)。

所以,回答这个问题:
最简单的方法可能是使用您提到的博客文章(父子层次结构)中描述的体系结构。如果你注意到这会导致你的用户界面“断断续续”,请尝试优化数据加载过程或尝试不同的架构。
使用工具在应用程序执行中找到“瓶颈”。

CodeData在我所知道的每个架构中都有“怪癖”/错误,你会逐渐找到它们,具体取决于你对它的使用。

答案 1 :(得分:0)

我的建议是使用父/子上下文模式。根据您提供的稀疏细节(例如,记录数量,数据总量,交付延迟等)。这似乎是最灵活,最成熟的解决方案,也可以容纳非常大的数据集。

与其他声明相反,无论“写入”对数据库的持续时间长短,您都可以拥有流畅的操作UI。显然,这就是后台线程的用途。保持UI流畅的机制是通过所谓的关于数据更改的通知。您可以优雅地对这些做出反应而不会打扰用户体验。

您对NSConfinementConcurrencyType的评论是正确的。如您的来源所述,它是为了向后兼容,所以你可以忘掉它。显然,对于并发性,您希望在创建上下文时使用NSPrivateQueueConcurrencyType