Мое приложение иногда вставляет объекты в контекст управляемого объекта, которые не должны обязательно сохраняться. Например, когда я запускаю мода "добавить сущность", я создаю управляемый объект и назначаю его модальному. Если пользователь сохраняет этот модальный режим, я сохраняю контекст. Если он отменяет, я удаляю объект, и сохранение не требуется.
Теперь я представил функцию импорта, которая переключается на мое приложение (с использованием схемы URL) и добавляет объект. Поскольку один из этих модалов может быть открытым, небезопасно сохранять контекст на этом этапе. Временный объект, созданный для модального, будет сохранен, даже если пользователь отменяет, и нет гарантии, что удаление (из операции отмены) будет сохранено позже - пользователь может выйти из приложения.
Точно так же я не могу просто сохранять, когда мое приложение завершается. Если модальность открыта в этой точке, временный объект будет неправильно сохранен.
Чтобы решить эту проблему, я пытаюсь использовать дочерний контекст, как обсуждалось здесь. Прочитав все, что я смог найти на SO, у меня возникло несколько вопросов:
-
Какой тип concurrency следует использовать для каждого контекста? Помните, что я не делаю этого для преимуществ производительности/потоков. Я знаю, что не могу использовать NSConfinementConcurrencyType для основного контекста, если у него есть дочерние контексты, но я не уверен, какой из двух других вариантов лучше всего подходит. Что касается детского контекста, нужно ли ему сопоставлять? Или я могу использовать здесь тип конфайнмента? Я пробовал различные комбинации, и все, кажется, работают нормально, но я хотел бы знать, что подходит для моих требований.
-
(боковая проблема) Почему я могу заставить это работать, если я использую класс iVar? Я думал, что должен уметь объявлять временный контекст в методе, где он создан, а затем позже ссылаться на него с помощью entity.managedObjectContext. Но, к сожалению, к тому моменту, когда я прихожу к нему? Это исправлено, если я вместо этого использую iVar для хранения ссылки.
-
Каков правильный способ или распространение изменений в главном контексте? Я видел различные комментарии, используя разные блокированные реализации в каждом из контекстов. Это зависит от моего типа concurrency? Моя текущая версия:
//save the new entity in the temporary context NSError *error = nil; if (![myObject.managedObjectContext save:&error]) {NSLog(@"Error - unable to save new object in its (temporary) context");} //propogate the save to the main context [self.mainContext performBlock:^{ NSError *error2 = nil; if (![self.mainContext save:&error2]) {NSLog(@"Error - unable to merge new entity into main context");} }];
-
Когда мой пользователь сохраняет, он отправляет своему делегату (моему контроллеру главного представления) сообщение. Делегату передается объект, который был добавлен, и он должен найти тот же самый объект в главном контексте. Но когда я ищу его в основном контексте, он не найден. В главном контексте есть содержится объект - я могу зарегистрировать его данные и подтвердить, что он есть, - но адрес отличается? Если это должно произойти (почему?), Как я могу найти добавленный объект в основном контексте после сохранения?
Спасибо за понимание. Извините за длинный, многочастный вопрос, но я думал, что кто-то, вероятно, рассмотрит все эти проблемы ранее.