Почему мой ivar не установлен в NSManagedObject Subclass
У меня есть проект с использованием CoreData. Я использую Mogenerator для генерации подклассов.
Когда я устанавливаю значение свойства, это значение фактически не назначается. Каждый раз, когда я пытаюсь установить значение, предыдущее значение, которое я установил, не было назначено.
Это работало нормально, так как моей базой данных была Mantle, но после перехода на CoreData это перестало работать. Я полагаюсь на KVO, чтобы поддерживать некоторые объекты UIView в актуальном состоянии с моделью.
Опять же, ивары подкласса CoreData NSManagedObject, похоже, не принимают значения, которые я им назначаю.
Рассмотрим следующий интерфейс:
@interface Light : _Light{}
/**
Light / Color Properties
*/
@property (nonatomic, assign) CGFloat brightness; // 0...1
@property (nonatomic, assign) CGFloat hue; // 0...1
@property (nonatomic, assign) CGFloat saturation; // 0...1
@property (nonatomic, assign, getter = isEnabled) BOOL enabled;
@property (nonatomic, readonly) UIColor *color; // derived from the above
- (void)setHue:(CGFloat)hue saturation:(CGFloat)saturation; // it often makes sense to set these together to generate fewer KVO on the color property.
@end
и следующий файл.m:
@interface Light ()
{
CGFloat _hue, _saturation, _brightness;
UIColor *_color;
}
@property (nonatomic, assign) BOOL suppressColorKVO;
@property (nonatomic, readwrite) UIColor *color;
@end
@implementation Light
@synthesize suppressColorKVO = _suppressColorKVO;
- (void)setHue:(CGFloat)hue saturation:(CGFloat)saturation
{
BOOL dirty = NO;
if (saturation != _saturation) {
// clamp its value
[self willChangeValueForKey:@"saturation"];
_saturation = MIN(MAX(saturation, 0.0f), 1.0f);
[self didChangeValueForKey:@"saturation"];
dirty = YES;
}
if (hue != _hue) {
[self willChangeValueForKey:@"hue"];
_hue = MIN(MAX(hue, 0.0f), 1.0f);
[self didChangeValueForKey:@"hue"];
dirty = YES;
}
if (dirty) {
if (!_suppressColorKVO) {
[self setColor: self.color];
}
}
}
// other stuff... the color accessors are also custom. Derived from the h, s, b values.
@end
Я предполагаю, что я не играю хорошо с CoreData, но я понятия не имею, что не так. Эти оттенок, насыщенность и яркость являются "переходными" (не в смысле основных данных), потому что они постоянно обновляются некоторыми аппаратными средствами, с которыми мы взаимодействуем, поэтому нет необходимости сохранять их состояние.
2 ответа
В конце концов, это не имеет ничего общего с CoreData. Этот подход выше работает с объектами CoreData. Вы можете иметь в подклассе некоторые "временные" свойства, которые существуют вне CoreData NSManagedObject, и вы можете создавать свои собственные ivars для них, и ваши собственные методы доступа, и он взаимодействует.
Что касается этого вопроса, у меня есть сложная система, которая также отправляет некоторые команды на некоторое оборудование, и оборудование возвращает ответ, приняло ли оно команду с текущим состоянием. Оказывается, у меня была ошибка в этом обработчике, которая возвращала этим значениям неожиданное значение.
То, что помогло мне отладить это, было использование точек наблюдения в отладчике. Действительно удобная функция! Вы устанавливаете точку наблюдения, и она будет прерываться в отладчике всякий раз, когда в адресе памяти вашей переменной будет установлено новое значение. (Немного об этом здесь)
Если hue
а также saturation
свойства в вашей модели, то вы должны установить их значения с помощью setPrimitiveValue:forKey:
(или связанные сгенерированные примитивные методы).
Тем не менее, ваш код выглядит как пользовательские атрибуты модели. NSNumber
instances и mogenerator создадут методы для вас. Так что я собираюсь предположить, что эти ваши атрибуты не поддерживаются в модели, и поэтому они не сохраняются.
Итак, добавьте атрибуты в модель и получите доступ к значениям, используя соответствующие методы.