主题中的问题。我有一个名为NSManagedObject
的{{1}}子类数组。现在我想对这些数据进行大量计算。这可能需要一些时间,所以我不想要阻止主线程。
report
我应该使用给定的背景let persistentContainer = DatabaseStack.shared.persistentContainer
persistentContainer.performBackgroundTask { (context) in
//HERE: calculation on reports array
}
重新提取reports
内的performBackgroundTask
数组。哪种重新获取方法最好?你能告诉我一个例子吗?
我知道context
不是线程安全的,但是我在iOS10下开发并使用NSManagedObject
方法。我想知道那里的方法是否没有处理它
我补充一点,现在一切正常(我不会重新获取对象),但我想知道这将始终没有随机崩溃。
答案 0 :(得分:1)
这仍然不安全。文档在最新文章中明确说明了这一点,描述了并发和队列:
NSManagedObject实例不打算在它们之间传递 队列。这样做可能会导致数据损坏和终止 申请。当需要交出托管对象时 从一个队列引用另一个队列,必须完成 NSManagedObjectID实例。
通过调用来检索托管对象的托管对象ID NSManagedObject实例上的objectID方法。
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html(在底部)
使用像perform这样的方法假设您使用上下文实现原子操作(例如创建MO并保存它们或者获取MO并提取数据以用于请求逻辑等)。