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