Странное поведение при использовании дочернего / родительского 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?