我想要实现以下目标:每当有人触发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/

10-12 05:24