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