2011-12-16 2 views
3

Я новичок в Core Data, и у меня есть некоторые вопросы о том, как правильно делать вещи. Я думаю, мне нужен временный ManagedObjectContext для работы с временными объектами, в то время как пользователь редактирует новый объект. Когда пользователь нажимает на сохранение этих данных, я хочу вставить эти объекты в файл persistedManagecObjectContext, а затем saveContext. Какова наилучшая практика для достижения этой цели? Поскольку я не хочу сохранять во временном контексте, обязательно использовать потоки?Основные данные и управляемые объекты Контексты

Спасибо за ваши знания!

+0

У меня нет времени, чтобы написать полный ответ, но вы можете попробовать использовать многоконтактную дату ядра, как описано здесь. Http://www.cocoanetics.com/2012/07/multi-context-coredata/ – Abizern

ответ

6

Вам необходимо объединить изменения во временном ManagedObjectContext (MOC) в сохраненный. Это пример того, как я это достиг. Я использую threading (один MOC для каждой нити), но Im очень уверен, что он должен отлично работать и без потоков.

Вы вызываете этот метод, чтобы сохранить изменения в tempMOC:

- (void) saveNewEntry { 
    NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; 

    // Subscribe to "NSManagedObjectContextDidSaveNotification" 
    // ..which is sent when "[tempMOC save];" is called. 
    [dnc addObserver: self 
      selector: @selector(mergeChanges:) 
       name: NSManagedObjectContextDidSaveNotification 
       object: tempMOC]; 

    // Save changes 
    [tempMOC save]; 

    // Remove subscribtion 
    [dnc removeObserver: self 
        name: NSManagedObjectContextDidSaveNotification 
       object: tempMOC]; 

} 

... который будет выстрелить уведомление:

- (void) mergeChanges: (NSNotification*) saveNotification { 

    // If youre using threads, this is necessary: 
    [self performSelectorOnMainThread: @selector(mergeToMainContext:) 
          withObject: saveNotification 
         waitUntilDone: NO]; 

    // ...otherwise, you could do the merge in this method 
    // [persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification]; 
} 

... который в свою очередь вызывает:

- (void) mergeToMainContext: (NSNotification*) saveNotification { 

    [persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification]; 

} 
+0

Это работает! Спасибо человеку, что вы спасли мой день! – Samui

+0

Ваш прием. Я просто заплачу за это. –

+0

Это решило огромную проблему - спасибо! – Slee

0

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

Я использую поле «temp» во всех моих объектах. Когда мне нужно создать «предварительный» объект, у меня есть метод в моем слое данных, который создает объект как нормальный, но затем перед возвратом flips isTemp = true.

Затем в моем «редакторе объекта» OnCancel есть:

if (obj.isTemp) { 
    [context deleteObject: ... ]; 
} 

OnSave является:

if (obj.isTemp) obj.isTemp = NO; 
[context saveAsUsual...]; 

Примечание: не рассматривается здесь есть проблема не копировать «выбросить» изменения в существующий объект, пока пользователь не подтвердит сохранение. В противном случае изменения будут сидеть там, как троянский конь, ожидающий применения, когда какой-то другой код сохраняет общий контекст.