过去几天我已经做了大量的研究,但我不确定当前的最佳做法是什么对于并发核心数据。最相关的帖子似乎是这个,但根据this analysis关于不同并发方法的表现,似乎现代方式与父上下文可能不是最好的。此外,来自Apple的this example未实施建议不使用默认NSConfinementConcurrencyType的Apple's own concurrency guide中提到的最佳做法。简单的并发核心数据
鉴于所有这些,使用Core Data实现并发的最简单和最好的方法是什么?我只需要一个后台线程,在不挂断用户界面的情况下对Core Data进行一些长时间的写操作。代码示例表示赞赏。
在什么情况下读取必须等待写入完成?我认为有两个上下文,一个用于阅读,另一个用于写作可以解决这个问题(除了可能在合并更改时)。另外,你可以详细了解一下你发现了什么样的“怪癖”吗? – GLee
写入操作会锁定持久存储协调器(在CoreData中,我注意到即使是读取操作也会锁定PSC)。这意味着任何其他操作(从任何情况下)都不可能通过该PSC进入商店。另外,写入操作会将文件锁定在SQLite引擎级别(以防止部分写入,然后在写入结束之前读取损坏的数据)。最后,写入操作从相同的原因锁定OS级别的文件。 –
至于“怪癖”/ bug ...主要是在上下文之间的变化以及取得的结果控制器对它们的反应之间进行合并。或父 - 子架构中的不可捕获异常(与在多对多关系中访问已删除对象有关)。还有更多内容,但是它本身就是一篇文章...... –