2014-01-19 3 views
2

У меня есть два подкласса NSManagedObject. Flight и Aircraft. Каждый Flight связан с одним Aircraft.Настройка отношений CoreData без контекста?

Когда пользователь создает Flight, я только сделать следующее:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Flight" inManagedObjectContext:self.managedObjectContext]; 
     self.flight = [[Flight alloc] initWithEntity:entity insertIntoManagedObjectContext:nil]; 

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

Это было отличное решение, до сих пор. Когда пользователь выбирает Aircraft, я делаю это:

[self.flight setAircraft:aircraft]; 

Однако, поскольку flight объект не был включен в managedObjectContext в приложение падает с этой ошибкой:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'aircraft' between objects in different contexts 

Это имеет смысл. И если я вставляю объект flight сразу после его создания, эта ошибка не возникает. Но тогда это создает проблему, что, если пользователь отменяет и больше не хочет этот объект полета?

ответ

1

Почему бы просто не использовать набор контекстов parent-child. Продолжайте вставлять все в детский контекст. Если пользователь, наконец, выбирает «Сохранить», сначала вызовите save: selector в дочернем контексте (а затем и в родительский контекст). Если пользователь, наконец, выбирает «Отмена», откат вызова: селектор в контексте для детей.

http://www.cocoanetics.com/2012/07/multi-context-coredata/

0

Похоже, что в конце концов пользователь сохранит эти изменения или отменит их, и никакая другая операция CoreData не произойдет в промежуточный период. Если это правда, когда вы готовы к сохранению, тогда звоните NSManagedObjectContext'ssave:. В противном случае вызовите его rollback и все изменения в стеке отмены (т. Е. Все, что вы изменили после предыдущего вызова save:, например создание flight), будет отменено.

+0

Я согласен с ор и яблоко делает слишком AFAICS -> они рекомендуют контекст царапанию –

+0

я бы не ставил незаконченные данные в какой-либо «глобальный контекст» –

0

использовать временный контекст для самолетов и полет .. контекст царапина

ТО Рекомендуемый способ AFAICS

если сохранить хиты пользователей, не сохранять контекст, иначе .. делать ничего

+0

у меня сложилось впечатление, что и 'Flight' и «Самолет» должен быть частью одного и того же контекста. Тем не менее, я не вижу, как будет работать временный, поскольку самолет уже сохранен в основном контексте. –

+0

тогда просто заправьте его :) youre right that они должны быть в том же ctx –

Смежные вопросы