Я работаю над кодом, который использует NSOperation
для импорта данных. Я бы хотел, чтобы пользователь мог отменить NSManagedObject
экземпляры, созданные во время операции импорта.
Из того, что я могу сказать, невозможно использовать NSManagedObjectContext
-undoManager
для любых операций, выполняемых вне основного потока. Из раздела Руководство по программированию базовых данных в Использование ограничения потока для поддержки параллелизма , у нас есть два условия:
- Должен быть передан только objectID
между контекстами управляемого объекта (на
отдельные темы)
- Управляемые объекты
должны быть сохранены в контексте перед
можно использовать идентификатор объекта.
Это имеет смысл, поскольку управляемые объекты необходимо переместить из частного хранилища (NSManagedObjectContext
) в общедоступное хранилище (NSPersistentStore
), прежде чем их можно будет совместно использовать.
К сожалению, сообщение -save:
также приводит к удалению любых управляемых объектов в стеке отмены. Из раздела Управление памятью с использованием базовых данных раздела того же руководства:
Управляемые объекты с ожидающими
изменения (вставки, удаления или
обновления) сохраняются в их контексте
пока их контекст не будет отправлен сохранить :,
сбросить, откатить или вернуть сообщение,
или соответствующее количество отмен, чтобы
отменить изменение.
Я пробовал несколько вещей, чтобы обойти это ограничение, и все в конечном итоге приводит к большей части работы, выполняемой в главном потоке (и вращающихся пляжных шариках). Любые подсказки, чтобы отменить работу с объектами, созданными из основного потока будет очень признателен.
-
Передан радар улучшения: rdar: // problem / 8977725