【发布时间】:2020-06-15 03:23:47
【问题描述】:
我想实现以下目标:每当有人触发CoreData 保存(即发送NSManagedObjectContextDidSave 通知)时,我想根据更改后的NSManagedObject 执行一些背景 计算。具体示例:假设在一个笔记应用中,我想异步计算所有笔记中的单词总数。
目前的问题在于 NSManagedObject 上下文明确绑定到线程,不鼓励您在该线程之外使用NSManagedObjects。
我在SceneDelegate 中设置了两个NSManagedObjectContexts:
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 上发送并且从不使用背景上下文。
关于如何解决这个问题的任何想法?这是一个错误吗?如何根据backgroundContext 检索通知,下游任务在关联的 DispatchQueue 上运行?
【问题讨论】:
-
publisher(for:) 有第二个参数 object,默认为 nil。尝试将 object 参数设置为您要观察的上下文。 Docs
-
保留背景上下文不是一个好主意,否则会充满不必要的对象
标签: ios swift core-data swift5 combine