DispatchQueue.global(qos: .background)
并且。
self.concurrentQueue.sync(flags: .barrier)
处理后台多线程问题。
由于使用的是 Swift 3,所以我使用了最新的方法来获取子上下文:
lazy var context: NSManagedObjectContext = {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
}()
我也启用了-com.apple.CoreData.ConcurrencyDebug 1
来调试。
然后问题出现了:
1、当有API调用并且在回调块(后台线程)中,我需要获取核心数据,进行编辑,然后保存。我尝试使用上面的代码中的self.context调用performBlockAndWait
,并在此块内部执行save
。整个过程很顺利,但是当我试图在此块之外但在回调块之内访问我的结果时,就会出现错误。我还尝试通过self.context和self.context.parent获取objectId和getObjectById
,但是这行会出现错误。我做错了什么,应该怎么做?因为我需要在许多不同的线程(而不是上下文)中使用结果。
2、我读到一篇文章说我需要每个线程一个上下文,在我的情况下,如果它是API调用的回调,我如何确定确切的线程,我真的需要这样做吗?
3、你可能会问我为什么需要一个privateConcurrentType,因为我的程序有需要在后台线程中运行的东西,所以必须这样做(从其他帖子中阅读),这是正确的吗?
4、即使在我的问题1中,通过将objectId传递给不同的上下文来获取对象仍然无法在我的情况下工作。假设这是正确的方法,我该如何管理在整个程序中在不同线程中传递这么多objectID而不会变得非常混乱?对我来说这听起来很疯狂,但我想应该有更清洁和更简单的方法来处理这个问题。
5、我阅读了许多旧帖子(在swift 3之前),它们必须执行childContext.save
然后parentContext.save
,但是由于我使用了上面的代码(仅限swift 3)。似乎我只需要执行childContext.save就可以使其工作?我是对的吗?