问题的简短版本:
我有一个带有大量声明属性的类,我想跟踪它是否有任何更改,以便当我调用save
方法,当不需要时它不会写入数据库。我如何更新isDirty
财产无需为所有声明的属性编写自定义设置器?
问题的较长版本:
假设我有一堂这样的课:
@interface MyObject : NSObject
{
@property (nonatomic, retain) NSString *myString;
@property (nonatomic, assign) BOOL myBool;
// ... LOTS more properties
@property (nonatomic, assign) BOOL isDirty;
}
...
@implementation MyObject
{
@synthesize myString;
@synthesize myBool;
// ... LOTS more synthesizes :)
@synthesize isDirty;
}
尝试1
我的第一个想法是实施setValue:forKey:
像这样:
- (void)setValue:(id)value forKey:(NSString *)key {
if (![key isEqualToString:@"isDirty"]) {
if ([self valueForKey:key] != value) {
if (![[self valueForKey:key] isEqual:value]) {
self.isDirty = YES;
}
}
}
[super setValue:value forKey:key];
}
除非您直接使用 setter 设置该值(即,myObject.myString = @"new string";
), 在这种情况下setValue:forKey:
没有被调用(我不知道为什么我认为它会被调用,哈哈)。
尝试2
观察自我的所有属性。
- (id)init
{
// Normal init stuff
// Start observing all properties of self
}
- (void)dealloc
{
// Stop observing all properties of self
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
// set isDirty to true
}
我很确定这会起作用,但我认为必须有更好的方法。 :)
我还希望这是自动的,这样我就不必维护要监视的属性列表。我可以很容易地看到在维护这个属性时忘记将属性添加到列表中,然后尝试找出为什么我的对象有时没有被保存。
希望我忽略了解决这个问题的更简单的方法!
最终解决方案
请参阅下面我的回答,了解我对此问题的最终解决方案。它基于 Josh Caswell 提供的答案,但它是一个有效的示例。