0

Я делаю приложение для рисования. С каждым краном создаются основные объекты данных. Пользователь может нажать кнопку отмены, и эти клики будут отменены за один раз. Это прекрасно работает.Основные данные, сохраняющие дочерний контекст в 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... 

    }]; 
}]; 

ответ

0

Одна идея состоит в том, чтобы приложить каждый блок кода, который вы хотите быть невыполнимым в своем блоке (с тем же контекстом ребенка). Возможно, начните разбивать его на два куска и посмотрите, работает ли это.

С другой стороны, я думаю, что каждое сохранение не действительно экономит, а просто подталкивает изменения до родительского контекста. Поэтому я предполагаю, что родительский контекст регистрирует каждого дочернего объекта как одно отменное событие. Возможно, вы могли бы попытаться сохранить более часто, а затем посмотреть, могут ли эти куски быть отменены.

+0

То, что вы описываете, именно то, что я хочу: каждый дочерний контекст сохраняет одно отменное событие. Но это не так. С каждым дочерним элементом он сохраняет все предыдущие операции в одном отменяемом событии, оставляя документ обратно, как он был при открытии. – Odrakir

+0

Итак? Пробовали ли вы первую стратегию с созданием отдельных контекстов? – Mundi

+0

Если я правильно понял, это то, что я делаю. Каждый блок кода, который я хочу отменить, находится внутри собственной функции executeBlock. Это не работает. – Odrakir