Установка отношений 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 2

3 ответа:

Почему бы просто не использовать набор родительско-дочерних контекстов. Продолжайте вставлять все в дочерний контекст. Если пользователь, наконец, выбирает "сохранить", вызовите save: selector сначала в дочернем контексте (а затем и в Родительском контексте). Если пользователь наконец выбирает "отмена", вызовите rollback: selector в дочернем контексте.

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

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

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

Это рекомендуемый способ АФАИКИ

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