Возможно, это полуразрешение :) Например, у вас есть следующий код, который существует в N объектах (каждый из них находится в отдельном потоке и создается одновременно (+ -10 мс)):
[coreObject addLinkedObject:linkedObject1];
Время обработки процедуры в контексте составляет около 70 мс.если вы просто установите NSMergePolicy (например): NSOverwriteMergePolicy , у вас будет Last-In-Changes: только последний объект будет добавлять ссылку, поскольку каждый контекст является моментальным снимком в памяти постоянного хранилища.Таким образом, каждый моментальный снимок создается во время обычного создания объекта.Задержка обработки в 70 мс приводит к тому, что информация coreObject устарела при ее сохранении.Другими словами, у вас будет только одна сохраненная ссылка или ошибка слияния.Конечно, вы можете подписаться на NSManagedObjectContextObjectsDidChangeNotification, но в этом случае у вас будет N!подписанные отношения или вы можете подписаться в звездной форме через главный контекст в главном потоке, но иногда это не сработало (я использую MagicalRecord, Copyright 2011 Magical Panda Software LLC.).Мое решение состоит в том, чтобы перечитать критический coreObject непосредственно перед его сохранением, а также использовать подходящую политику слияния:
@synchronized (self) {
if ([context hasChanges]) {
if (needRefresh) {
[context refreshObject:coreObject mergeChanges:NO];
[coreObject addLinkedObject:linkedObject1];
}
NSError *err = nil;
[context save:&err];
if (err) {
NSLog(@"Error Saving Linked Object: %@", [err userInfo]);
[context rollback];
}
}
}
В этом случае риск минимален.