Ios 为什么我的ivar没有设置在NSManagedObject子类上

Ios 为什么我的ivar没有设置在NSManagedObject子类上,ios,objective-c,core-data,nsmanagedobject,mogenerator,Ios,Objective C,Core Data,Nsmanagedobject,Mogenerator,我有一个使用CoreData的项目。我使用Mogenerator生成子类 当我设置一个属性的值时,这个值实际上并没有赋值。以后每次我尝试设置该值时,都没有指定之前设置的值 这很好,因为我的底层数据框架是Mantle,但由于移动到CoreData,这就停止了工作。我依靠KVO使一些UIView对象与模型保持最新 同样,CoreData NSManagedObject子类的IVAR似乎不接受我分配给它们的值 考虑以下接口: @interface Light : _Light{} /** Ligh

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

当我设置一个属性的值时,这个值实际上并没有赋值。以后每次我尝试设置该值时,都没有指定之前设置的值

这很好,因为我的底层数据框架是Mantle,但由于移动到CoreData,这就停止了工作。我依靠KVO使一些UIView对象与模型保持最新

同样,CoreData NSManagedObject子类的IVAR似乎不接受我分配给它们的值

考虑以下接口:

@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不是很好,但我不知道出了什么问题。这些色调、饱和度和亮度都是“瞬时的”(不是核心数据意义上的)因为它们会被我们所连接的某些硬件不断更新,所以不需要保存它们的状态。

如果
色调
饱和度
是模型中的属性,那么您应该使用
设置原语值:forKey:
(或相关生成的原语方法)设置它们的值

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


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

最后,它与CoreData无关。上述方法确实适用于CoreData对象。您可以在子类中包含一些存在于CoreData NSManagedObject之外的“瞬态”属性,您可以为它们创建自己的IVAR,以及自己的访问器,并与之协作

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


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

什么是“[self-setColor:self.color]”?这看起来很奇怪,你覆盖了颜色获取方法吗?是的,不用担心两者都是自定义的,我这样做是因为颜色是派生的,而设置颜色则是为了发送KVO。这不是问题所在。它很好用。是IVAR没有保持我对它们设定的价值。今天晚些时候我会这样做。根本不是CoreData专家,你是说让我自己的IVAR“在CoreData模型之外”(即不声明,并由我自己的访问器管理,好像它是NSObject的一个直接子类)是行不通的吗?我更愿意这样做,因为它们实在是太临时了,我认为只需将CoreData排除在外即可。托管对象不是这样设计的。如果要这样做,应该使用普通对象。不能使用普通对象。无论如何,为了真正追踪这个问题的根源,我采取了这个问题行为,将它与我的应用程序的其他功能隔离开来,将它放入一个测试/沙箱项目中,并注意到我不再看到这个问题。所以我猜我上面描述的问题不是全部。当我找到问题的根源时,我将进行更新。