Синхронизировать два разных UndoManager - PullRequest
2 голосов
/ 15 января 2020

Я использую 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 эти два разных менеджера отмены.

...