我希望实现以下功能:每当有人触发 CoreData 保存(即发送NSManagedObjectContextDidSave
通知)时,我想基于更改的NSManagedObject
执行一些后台计算。具体例子:假设在一个笔记应用中,我想异步计算所有笔记中单词总数。
目前问题在于NSManagedObject
上下文明确绑定到线程,并且不建议在此线程之外使用NSManagedObject
。
我已经在我的SceneDelegate
中设置了两个NSManagedObjectContext
:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let backgroundContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
我还通过NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)
订阅了通知,并在触发一个managedObjectContext.save()
后收到了两次保存通知。但是,这两个通知都是从同一个线程(即UIThread)发送的,用户字典中所有的NSManagedObjects
都有一个.managedObjectContext
,它是viewContext
而不是backgroundContext
。
我的想法是基于相关的NSManagedObjectContext
是否为后台上下文过滤通知,因为我认为通知也会在(私有)DispatchQueue上发送,但似乎所有通知都在UIThread上发送,而后台上下文从未使用。
你有什么解决方法吗?这是一个bug吗?如何根据backgroundContext
检索通知,同时在关联的DispatchQueue上运行下游任务?