0

我有一个使用 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 玩得不好,但我不知道出了什么问题。这些色调、饱和度、亮度都是“瞬态的”(不是核心数据意义上的),因为它们会被我们与之交互的某些硬件不断更新,因此无需保存它们的状态。

4

2 回答 2

0

如果hue并且saturation是模型中的属性,那么您应该使用setPrimitiveValue:forKey:(或相关生成的原始方法)设置它们的值。

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

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

于 2014-02-02T21:58:31.150 回答
0

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

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

帮助我调试它的是在调试器中使用观察点。非常方便的功能!您设置了一个观察点,只要变量的内存地址设置为新值,它就会在调试器中中断。(这里还有一点点)

于 2014-02-03T11:16:19.993 回答