Когда Core Data Nullify обновляет правила отношений?
У меня отношение «один ко многим» A <--- >> B (часть ко многим заказана).
При удалении A все B, имеющие отношение к A, также должны быть удалены, поэтому правило удаления для отношения A к B устанавливается каскадным.-> Работает нормальноПри удалении B должно быть очищено только отношение обратно к A, поэтому правило удаления для отношения B к A установлено равным нулю-> Не работает (только после задержки)Описание проблемы:Так что у меня точно такая же проблема, как указано в этом вопросе«Правило обнуления базовых данных не работает?»: Я удаляю B, который имеет отношение к A, и сразу после этого подсчитываю количество оставшихся B, с которыми A имеет отношение, и оно такое же, как и раньше. Принятым ответом на этот вопрос было использование каскада вместо обнуления, так как то, что делает обнуление:
Nullify устанавливает указатель в null, когда объект удаляется. Если у вас есть массив указателей, он не удаляет его, он просто устанавливает его на ноль.
Я вижу 2 вопроса с этим ответом:
Я почти уверен, что каскад является неправильным правилом в этом случае, потому что он также удалит A при удалении B, а это не то, чего я хочу достичь. (Я все же попробовал, и результат оказался таким, как я ожидал: A также был удален).Коллекция не может иметь значение null в качестве одного из своих элементов, за исключением того, что один использует NSNull singleton. Поэтому я сомневаюсь, что это то, что делает правило отмены.Немного поэкспериментировав, я обнаружил, что, если я удаляю экземпляр B, он удаляется немедленно, но отношение к A очищается не сразу, а только после небольшой задержки:
// Method is called by pressing a button
-(void)removeLastBOfA:(A *)instanceOfA
{
// Prints 4
NSLog(@"fetch all b's count before:%d", [context fetchAllBs].count);
// Prints 4
NSLog(@"A's relation to B count before: %d", instanceOfA.relationToB.count);
[context deleteObject:[instanceOfA.relationToB lastObject]];
// Prints 3
NSLog(@"fetch all b's count after:%d", [context fetchAllBs].count);
// Prints 4, but should be 3. Last Object of A's relationToB is still the object that was deleted
NSLog(@"A's relation to B count after: %d", instanceOfA.relationToB.count);
}
Теперь при нажатии кнопки для повторного вызова описанного выше метода без каких-либо промежуточных действий, внезапно отношение обновляется, и «отношение A к B считается раньше:3"напечатано. Таким образом, правило отмены удаления работает так, как я хочу, но с небольшой задержкой.
Вопросов:Являются ли две проблемы, которые я указал, действительны?Почему аннулирование обновляет отношение только после задержки и что это за задержка? Или в какой момент отношения обновляются после удаления NSManagedObject?