Установка отношений CoreData без контекста?
У меня есть два подкласса NSManagedObject
. Flight
и Aircraft
. Каждый Flight
связан с одним Aircraft
.
Когда пользователь создает 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
, как только он сделан, эта ошибка не возникает. Но тогда это создает проблему, что, если пользователь отменяет и больше не хочет этот объект полета?
3 ответа:
Почему бы просто не использовать набор родительско-дочерних контекстов. Продолжайте вставлять все в дочерний контекст. Если пользователь, наконец, выбирает "сохранить", вызовите save: selector сначала в дочернем контексте (а затем и в Родительском контексте). Если пользователь наконец выбирает "отмена", вызовите rollback: selector в дочернем контексте.
Похоже, что в конечном итоге пользователь либо сохранит эти изменения, либо отменит их, и никакой другой операции CoreData не произойдет в промежуточный период. Если это правда, то когда вы будете готовы к спасению, позвоните
NSManagedObjectContext's
save:
а потом... В противном случае вызовите егоrollback
, и все изменения в стеке отмены (то есть все, что вы изменили с момента предыдущего вызоваsave:
, например созданиеflight
) будут отменены.