为什么我的ivar没有在NSManagedObject Subclass上设置

时间:2014-02-02 20:47:05

标签: ios objective-c core-data nsmanagedobject mogenerator

我有一个使用CoreData的项目。我使用Mogenerator生成子类。

当我设置属性的值时,实际上并未分配此值。每次我尝试设置值时,我设置的前一个值都没有分配。

这很好用,因为我的底层数据框架是Mantle,但是自从迁移到CoreData后,它就停止了工作。我依靠KVO来保持一些UIView对象与模型保持同步。

同样,CoreData NSManagedObject子类的ivars似乎没有采用我赋予它们的值。

考虑以下界面:

@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 个答案:

答案 0 :(得分:0)

如果huesaturation是模型中的属性,则应使用setPrimitiveValue:forKey:(或关联的生成基元方法)设置其值。

也就是说,您的代码看起来都是自定义的,因为模型属性是NSNumber个实例,而mogenerator会为您创建值方法。所以我猜想你所拥有的这些属性不会在模型中得到支持,这就是为什么它们没有被存储。

因此,将属性添加到模型并使用适当的方法访问值。

答案 1 :(得分:0)

最后它与CoreData无关。上面的这种方法可以使用CoreData对象。你可以在子类中拥有一些存在于CoreData NSManagedObject之外的“瞬态”属性,你可以为它们和你自己的访问器创建自己的ivars,并且它会合作。

关于这个问题,我有一个复杂的系统,它也会向某些硬件发送一些命令,并且硬件会返回一个响应,无论它是否接受了当前状态的命令。事实证明我在该处理程序中有一个错误,它将这些值设置回某个意外值。

帮助我调试的是在调试器中使用观察点。真的很方便!设置一个观察点,只要变量的内存地址设置为新值,它就会在调试器中中断。 (一点点more on that here