Ios 为什么我的ivar没有设置在NSManagedObject子类上
我有一个使用CoreData的项目。我使用Mogenerator生成子类 当我设置一个属性的值时,这个值实际上并没有赋值。以后每次我尝试设置该值时,都没有指定之前设置的值 这很好,因为我的底层数据框架是Mantle,但由于移动到CoreData,这就停止了工作。我依靠KVO使一些UIView对象与模型保持最新 同样,CoreData NSManagedObject子类的IVAR似乎不接受我分配给它们的值 考虑以下接口: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
@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排除在外即可。托管对象不是这样设计的。如果要这样做,应该使用普通对象。不能使用普通对象。无论如何,为了真正追踪这个问题的根源,我采取了这个问题行为,将它与我的应用程序的其他功能隔离开来,将它放入一个测试/沙箱项目中,并注意到我不再看到这个问题。所以我猜我上面描述的问题不是全部。当我找到问题的根源时,我将进行更新。