Я делаю приложение для рисования. С каждым краном создаются основные объекты данных. Пользователь может нажать кнопку отмены, и эти клики будут отменены за один раз. Это прекрасно работает.Основные данные, сохраняющие дочерний контекст в performBlock: удаляет стопку отмены
Проблема возникает, когда запускается какая-то автоматическая задача. У меня есть кнопка, которая создает кучу основных объектов данных (рисует некоторые вещи отдельно) в дочернем контексте, а затем сохраняет контекст, чтобы изменения отражались в основном контексте.
Проблема заключается в том, что не имеет значения, сколько раз пользователь нажимает кнопку задачи, все изменения сгруппированы в один единственный шаг отмены.
Чтобы сделать это ясно: он делает 5 заданий, а затем ударяет один раз, и он возвращается в начале. Но я хочу, чтобы он мог отменить каждую задачу по одному за раз.
Я использую UIManagedDocument и это стек Core Data. Таким образом, это два контекста: один, который записывает на диск, и его дочерний элемент для общего использования, а затем создаю дочерний элемент последнего для фоновых операций.
Это мой код:
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...
}];
}];
То, что вы описываете, именно то, что я хочу: каждый дочерний контекст сохраняет одно отменное событие. Но это не так. С каждым дочерним элементом он сохраняет все предыдущие операции в одном отменяемом событии, оставляя документ обратно, как он был при открытии. – Odrakir
Итак? Пробовали ли вы первую стратегию с созданием отдельных контекстов? – Mundi
Если я правильно понял, это то, что я делаю. Каждый блок кода, который я хочу отменить, находится внутри собственной функции executeBlock. Это не работает. – Odrakir