Я использую Core Data Undo Manager и просматриваю пользовательский Undo Manager.
Базовые данные с BackgroundTask. Стек основных данных моего проекта почти такой же, как и в яблочных документах ниже. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/Concurrency.html
При изменении некоторого содержимого (создание обновления или удаление) просмотрите менеджер отмены просмотра registerUndo и сохраните закрытый управляемый контекст основных данных (он выполняет задачу отмены для своих родителей, отменяет менеджер.)
Итак, я хочу синхронизировать эти два менеджера отмены. Есть ли лучшая практика с этими проблемами?
Я просто делаю так, что с помощью обработчика уведомлений с именем «NSUndoManagerDidUndoChange» вызывает отмену, как это.
func undoManagerDidUndo() {
DispatchQueue.main.async {
self.canvasView.undoManager?.undo()
self.setUndoButton()
}
}
func undoManagerDidRedo() {
DispatchQueue.main.async {
self.canvasView.undoManager?.redo()
self.setUndoButton()
}
}
func setUndoButton() {
guard let coreUndoManager = self.drawService.undoManager, let canvasUndoManager = self.canvasView.undoManager else { return }
DispatchQueue.main.async {
self.undoBtn.isEnabled = (coreUndoManager.canUndo && canvasUndoManager.canUndo)
self.redoBtn.isEnabled = (coreUndoManager.canRedo && canvasUndoManager.canRedo)
}
}
init() {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
self.mainContext = appDelegate.coreDataStack.mainContext
// self.mainContext!.undoManager = UndoManager()
privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateMOC?.parent = mainContext
self.undoStackCount = 0
self.taskCount = 0
let nc = NotificationCenter.default
nc.addObserver(self, selector: #selector(self.contextDidChange), name: NSNotification.Name.NSManagedObjectContextObjectsDidChange, object: self.privateMOC)
nc.addObserver(self, selector: #selector(self.undoManagerDidUndo), name: NSNotification.Name.NSUndoManagerDidUndoChange, object: self.undoManager)
nc.addObserver(self, selector: #selector(self.undoManagerDidRedo), name: NSNotification.Name.NSUndoManagerDidRedoChange, object: self.undoManager)
}
Это работает почти хорошо , но когда фоновая задача становится больше, она не синхронизируется c.
Итак, как мне синхронизировать c эти два разных менеджера отмены.