Почему мой 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 создадут методы для вас. Так что я собираюсь предположить, что эти ваши атрибуты не поддерживаются в модели, и поэтому они не сохраняются.

Итак, добавьте атрибуты в модель и получите доступ к значениям, используя соответствующие методы.

Другие вопросы по тегам