Ответ 1
У меня была та же цель, что и у вас (delete B, как только удаляется последний ссылочный A). Мне потребовалось больше времени, чем ожидалось, чтобы все было правильно. В частности, потому что
- В то время, когда A готовится к удалению, отношения со многими в B могут не обновляться, поэтому вы не можете просто подсчитать A в B.
- isDeleted on A, похоже, уже установлен во время
-prepareForDeletion
Вот что сработало для меня, если кто-нибудь заинтересован (я буду использовать Employee & Employee, потому что его легче читать):
В Employee:
- (void)prepareForDeletion {
// Delete our department if we we're the last employee associated with it.
Department *department = self.department;
if (department && (department.isDeleted == NO)) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isDeleted == NO"];
NSSet *employees = [department.employees filteredSetUsingPredicate:predicate];
if ([employees count] == 0) {
[self.managedObjectContext deleteObject:department];
}
}
}
Другие люди предложили включить эту логику в -willSave
в Отдел. Я предпочитаю решение выше, поскольку в некоторых случаях я мог бы хотеть сохранить пустой отдел (например, во время миграции хранилища вручную или импорта данных).