问题的简短版本:
我有一个带有大量声明属性的类,我想跟踪它是否有任何更改,以便当我调用它的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];
}
这可以完美地工作,直到您直接使用设置器(即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 提供的答案,但它是一个工作示例。