我有一个使用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的表现并不好,但我不知道出了什么问题。这些色调,饱和度,亮度都是“瞬态的”(不是核心数据意义上的),因为它们会通过我们正在连接的某些硬件不断更新,因此不需要保存它们的状态。
答案 0 :(得分:0)
如果hue
和saturation
是模型中的属性,则应使用setPrimitiveValue:forKey:
(或关联的生成基元方法)设置其值。
也就是说,您的代码看起来都是自定义的,因为模型属性是NSNumber
个实例,而mogenerator会为您创建值方法。所以我猜想你所拥有的这些属性不会在模型中得到支持,这就是为什么它们没有被存储。
因此,将属性添加到模型并使用适当的方法访问值。
答案 1 :(得分:0)
最后它与CoreData无关。上面的这种方法可以使用CoreData对象。你可以在子类中拥有一些存在于CoreData NSManagedObject之外的“瞬态”属性,你可以为它们和你自己的访问器创建自己的ivars,并且它会合作。
关于这个问题,我有一个复杂的系统,它也会向某些硬件发送一些命令,并且硬件会返回一个响应,无论它是否接受了当前状态的命令。事实证明我在该处理程序中有一个错误,它将这些值设置回某个意外值。
帮助我调试的是在调试器中使用观察点。真的很方便!设置一个观察点,只要变量的内存地址设置为新值,它就会在调试器中中断。 (一点点more on that here)