我想要实现以下目标:每当有人触发CoreData保存(即,发送了NSManagedObjectContextDidSave
通知)时,我想根据更改后的NSManagedObject进行一些背景计算。具体示例:假设在一个笔记应用程序中,我想异步计算所有笔记中的单词总数。
当前的问题在于,NSManagedObject上下文已显式绑定(bind)到线程,并且不鼓励您在此线程之外使用NSManagedObject
。
我在NSManagedObjectContext
中设置了两个SceneDelegate
:let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContextlet backgroundContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
我还通过NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)
订阅了通知,并且仅触发了一个managedObjectContext.save()
后,我收到了两次保存通知。但是,两个通知都是从同一个线程(即UIThread)发送的,并且用户词典中的所有NSManagedObjects
都有一个.managedObjectContext
,它是viewContext
而不是backgroundContext
。
我的想法是根据关联的NSManagedObjectContext
是否为背景过滤通知,因为我假设通知也通过(私有(private))DispatchQueue发送,但似乎所有通知都是在UIThread上发送的,而后台上下文从不发送用过的。
关于如何解决这个问题的任何想法?这是一个错误吗?如何在关联的DispatchQueue上运行下游任务的情况下,基于backgroundContext
检索通知?
最佳答案
您可以将想要观察的对象传递给publisher(for:)
:
NotificationCenter.default
.publisher(for: .NSManagedObjectContextDidSave, object: backgroundMoc)
.sink(receiveValue: { notification in
// handle changes
})
那只会监听与后台管理对象上下文有关的通知,这意味着您可以安全地对该上下文的队列进行处理。
关于ios - 如何: Using Combine to react to CoreData changes in the background,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60495494/