Стратегия регистрации основных данных - PullRequest
0 голосов
/ 14 сентября 2011

Я пытался использовать второй контекст управляемого объекта (MOC) в основных данных, чтобы добавить продажи, которые будут перечислены в NSTableView как ожидающие, пока пользователь не нажмет кнопку для обработки транзакций.

После нажатия кнопки 2-й контекст сохраняется, и NSManagedObjectContextDidSaveNotification запускает mergeChangesFromContextDidSaveNotification в главном контексте.

Пока все в порядке. Но затем мне нужно очистить второй контекст, чтобы следующая транзакция продажи была на пустом MOC. Также, чтобы очистить его от действия отмены или изменения пользователя.

Кажется, что очистка второго MOC невозможна ... и я убедился после поиска решения, что это не жизнеспособный шаблон данных ядра. Вместо этого я теперь возвращаюсь, чтобы использовать только один контекст. Тем не менее, текущая продажа теперь отображает все транзакции, где я хотел бы только текущие. Опять же, если бы я мог перечислить текущие «ожидающие» транзакции там, есть кнопка «Отмена», чтобы отменить их при необходимости; и очистить таблицу после кнопки «процесс продажи», чтобы получить аналогичные средства управления транзакциями.

Итак, я застрял, поскольку не существует очевидного способа идентифицировать «текущие» / ожидающие транзакции из других недавних.

Мне нужен двухэтапный ввод данных. (1) добавить продажи, редактировать и т. Д. (2) обработать, то есть зафиксировать эти продажи

Итак, первая стратегия в принципе выглядит нормально и предлагается (http://developer.apple.com/library/mac/#documentation/DataManagement/Devpedia-CoreData/managedObjectContext.html), а также в этом уроке (http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/)

Тем не менее, метод, используемый в этом руководстве, сохраняет только один управляемый объект во втором контексте и копирует / удаляет по мере необходимости.

Является ли наилучшей стратегией использовать первый подход со вторым MOC и копировать и удалять транзакции, а не объединять?

Или есть более простое решение, которого я пока не вижу?

Надеюсь, этот вопрос имеет смысл :-) и любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Просто введите атрибут status для вашей транзакции, где вы храните информацию об ожидающих транзакциях.Во время записи часто сохраняйте данные (что не слишком дорого из-за очень малого количества данных).Таким образом, вы можете полностью закрыть приложение и возобновить работу именно с того места, где остановился пользователь, восстановив ту же ситуацию из постоянного хранилища ...

В любом случае ваша стратегия перехода на один MOCправильный.

0 голосов
/ 16 сентября 2011

Что касается технической реализации решения, он хотел поделиться этим методом, так как кажется очень сложным разобраться в построителе интерфейса относительно применения предиката к результатам.На самом деле я потратил некоторое время на поиски удобного способа использования привязок и построителя интерфейса.

Итак, похоже, работает добавление пользовательских NSArrayControllers для каждой выходной таблицы.В таблице ожидающих продаж свяжите с SalesController;Я просто подкласс NSArrayController, а затем внести изменения в awakeFromNib, как показано ниже.Закомментированная строка - это попытка, которая не оказала никакого влияния вообще, поэтому я не совсем понимаю роль предиката выборки, но установка предиката фильтра дает желаемый эффект.Для перечисленных подтвержденных транзакций то же самое, но с "pending == NO"

-(void)awakeFromNib {
 //    [self setFetchPredicate:[NSPredicate predicateWithFormat:@"pending == YES"]];

    [self setFilterPredicate:[NSPredicate predicateWithFormat:@"pending == YES"]];
}
...