Я хочу добиться следующего: всякий раз, когда кто-то запускает сохранение CoreData (ie. NSManagedObjectContextDidSave
уведомление отправляется), я хотел бы выполнить некоторые фоновые вычисления на основе измененного NSManagedObject. Конкретный пример. Предположим, что в приложении для заметок я хочу асинхронно вычислять общее количество слов во всех заметках.
В настоящее время проблема заключается в том факте, что контекст NSManagedObject явно связан с потоком, и вам не рекомендуется использовать NSManagedObject
s вне этой темы.
У меня есть две NSManagedObjectContext
s в моих SceneDelegate
:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let backgroundContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
Я также подписался на уведомление через NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)
и получаю уведомление о сохранении дважды после запуска только one managedObjectContext.save()
. Однако оба уведомления отправляются из одного потока (который является UIThread), и все NSManagedObjects
в пользовательском словаре имеют .managedObjectContext
, то есть viewContext
, а не backgroundContext
.
My Идея состояла в том, чтобы отфильтровать уведомления, основываясь на том, был ли связанный NSManagedObjectContext
фоновым, поскольку я предполагал, что уведомление также отправляется в (частном) DispatchQueue, но кажется, что все уведомления отправляются в UIThread, и фоновый контекст никогда не использовал.
Есть идеи, как решить эту проблему? Это ошибка? Как я могу получить уведомления на основе backgroundContext
с последующими задачами, выполняемыми в соответствующем DispatchQueue?