我可以安全地将NSManagedObject传递给performBackgroundTask吗?

时间:2018-01-10 11:52:11

标签: swift multithreading core-data io

主题中的问题。我有一个名为NSManagedObject的{​​{1}}子类数组。现在我想对这些数据进行大量计算。这可能需要一些时间,所以我不想要阻止主线程。

report

我应该使用给定的背景let persistentContainer = DatabaseStack.shared.persistentContainer persistentContainer.performBackgroundTask { (context) in //HERE: calculation on reports array } 重新提取reports内的performBackgroundTask数组。哪种重新获取方法最好?你能告诉我一个例子吗?

修改

我知道context不是线程安全的,但是我在iOS10下开发并使用NSManagedObject方法。我想知道那里的方法是否没有处理它

EDIT2

我补充一点,现在一切正常(我不会重新获取对象),但我想知道这将始终没有随机崩溃。

1 个答案:

答案 0 :(得分:1)

这仍然不安全。文档在最新文章中明确说明了这一点,描述了并发和队列:

  

NSManagedObject实例不打算在它们之间传递   队列。这样做可能会导致数据损坏和终止   申请。当需要交出托管对象时   从一个队列引用另一个队列,必须完成   NSManagedObjectID实例。

     

通过调用来检索托管对象的托管对象ID   NSManagedObject实例上的objectID方法。

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html(在底部)

使用像perform这样的方法假设您使用上下文实现原子操作(例如创建MO并保存它们或者获取MO并提取数据以用于请求逻辑等)。