Странное поведение при использовании дочернего / родительского NSManagedObjectContext

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

Из-за этого я использую два NSManagedObjectContexts (MOC), дочерний и родительский, и они всегда должны быть синхронизированы. Чтобы убедиться, что они синхронизированы, я всегда редактирую / добавляю данные в дочерний MOC, чтобы он передавался в основной MOC по следующей схеме:

[childMOC performBlock:^{

    MyObject *myObject = *create new object in childMOC*

    [childMOC save:&error];

    [mainMOC performBlock:^{
        [mainMOC save:&error];
        // Is this mandatory to make it work correctly?
        // [childMOC performBlock:^{
        //     [childMOC refreshObject:myObject mergeChanges:NO];
        // }];
    }];
}];

Через некоторое время у меня появилось две версии одного и того же объекта в фоновом контексте: одна с временным идентификатором, а другая с постоянным идентификатором. Если я, например, добавили дочерние объекты в «реальный» объект один (передавая свежий постоянный идентификатор из основного в дочерний MOC) я не видел эти объекты, когда извлекал свой объект в фоновом MOC, потому что это старый временный объект, который кэшируется.

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

It doesn't feel right that it can be two versions of the same object within a context. If I pass an NSManagedObjectID to the child MOC and retrieve that, shouldn't the child MOC update my existing object instead of creating a new one and leave my old temporary as cached default?

Do I need to use the commented row on each place I create an object?

Or maybe it works with mergeChangesFromContextDidSaveNotification, will that give the same effect?

Ответы на вопрос(2)

Ваш ответ на вопрос