Я должен записать пользовательский метод установщика для поля (мы назовем его foo
) в моем подклассе NSManagedObject
. foo
определяется в модели данных, и XCode автоматически сгенерировал @property
и @dynamic
поля в.h и.m файлах соответственно.
Если я пишу свой метод set как это:
- (void)setFoo: (NSObject *)inFoo {
[super setFoo: inFoo];
[self updateStuff];
}
затем я получаю предупреждение компилятора на вызове к super
.
С другой стороны, если я делаю это:
- (void)setFoo: (NSObject *)inFoo {
[super setValue: inFoo forKey: inFoo];
[self updateStuff];
}
затем я заканчиваю в бесконечном цикле.
Таким образом, что корректный подход должен записать пользовательскому методу set для подкласса NSManagedObject?
Я думаю, что здесь есть небольшая ошибка: используйте
[self setPrimitiveValue:inFoo forKey:@"foo"];
вместо
[self setPrimitiveFoo:inFoo];
это работает для меня.
Согласно документации, это будет:
- (void) setFoo:(NSObject *)inFoo {
[self willChangeValueForKey:@"foo"];
[self setPrimitiveValue:inFoo forKey:@"foo"];
[self didChangeValueForKey:@"foo"];
}
Это, конечно, игнорирование того факта, что NSManagedObjects
в качестве атрибутов нужны только NSNumbers
, NSDates
, NSDatas
и NSStrings
.
Однако это может быть не лучшим подходом. Поскольку вы хотите, чтобы что-то происходило, когда значение вашего свойства foo
изменяется, почему бы просто не наблюдать это с помощью Key Value Observing? В данном случае это звучит как «КВО — это путь, по которым нужно идти».