Вы можете установить постоянные свойства из willSave
, вам просто нужно быть более осторожным с этим.
Из willSave
документов:
Этот методможет иметь «побочные эффекты» на постоянные значения.Вы можете использовать его, например, для вычисления постоянных значений из других временных значений или значений блокнота.
Если вы хотите обновить постоянное значение свойства, вам обычно следует проверять равенство любого нового значения существующему значению довносить изменения.Если вы изменяете значения свойств с помощью стандартных методов доступа, Core Data будет наблюдать уведомление о результирующем изменении и поэтому снова вызовет willSave перед сохранением контекста управляемого объекта объекта.Если вы продолжите изменять значение в willSave, willSave будет вызываться до тех пор, пока ваша программа не выйдет из строя.
Итак, что происходит, вы меняете computedProperty
, что вызывает willSave
кбыть вызванным снова, что изменит computedProperty
, что вызовет willSave
снова, до тех пор, пока ваша программа не выйдет из строя.
Чтобы это исправить, вам нужно проверить, нужно ли снова установить computedProperty
:
- (void)willSave
{
id computed = [self computedValueFromTransientProperty];
if (![self.computedProperty isEqual:computed])
{
self.computedProperty = computed;
}
}
Это будет означать, что computedValueFromTransientProperty
будет вызываться дважды, поэтому вы можете не делать этого, если метод требует больших вычислительных затрат.
Другой вариант - использовать метод набора примитивов, который будет означатьwillSave
не будет вызываться дважды, но может иметь побочные эффекты в зависимости от того, как ваше приложение взаимодействует с базовыми данными:
- (void)willSave
{
self.primitiveComputedProperty = [self computedValueFromTransientProperty];
}