質問の短いバージョン:
私は大量の宣言されたプロパティを持つクラスを持っており、それに変更があったかどうかを追跡して、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 が提供した回答に基づいていますが、実用的な例です。