Я делаю приложение для рисования. При каждом касании создаются некоторые основные объекты данных. Пользователь может нажать кнопку отмены, и эти клики будут отменены по одному. Это прекрасно работает.
Проблема возникает, когда запускается какая-то автоматизированная задача. У меня есть кнопка, которая создает набор основных объектов данных (рисует некоторые вещи сама по себе) в дочернем контексте, а затем сохраняет контекст, чтобы изменения отражались в основном контексте.
Проблема в том, что не имеет значения, сколько раз пользователь нажимает кнопку задачи, все изменения группируются в один шаг отмены.
Чтобы было понятно: он выполняет 5 задач, а затем один раз нажимает кнопку «Отменить» и возвращается к началу. Но я хочу, чтобы он мог отменить каждую задачу по одной.
Я использую UIManagedDocument и его стек основных данных. Итак, это 2 контекста: один для записи на диск и его дочерний элемент для общего использования, а затем я создаю дочерний элемент последнего для фоновых операций.
Это мой код:
NSManagedObjectContext* childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childContext.parentContext = self.document.managedObjectContext;
childContext.undoManager = self.document.undoManager;
[childContext performBlock:^{
//a lot of things happen here, that generate many entities
[childContext save:nil];
[self.document.managedObjectContext performBlock:^{
//completion stuff, update UI...
}];
}];