各書き込みトランザクションを実行した後に手動で設定した管理されていないisDirty
プロパティを単に持たないのは、KVOが最適な方法です。
カスタムセッターを設定することは、本当に信じられないほど乱雑になります。あなたは、あなたが追跡したいと思ったそれぞれのプロパティに対して別々のものを持たなければなりません。
レルム通知は、オブジェクトのセットを追跡していて、変更されたものがある場合(collection notificationsを使用)またはif anything in the Realm changedの場合にのみ機能します。
KVOを使用すると、オブザーバをすべてのプロパティに追加するためにオブジェクトのサブクラス自体を取得することができます。オブザーバは、変更されたときに常に1つのメソッドに送られ、isDirty
プロパティをマークできます。
@interface MyObject: RLMObject
@property NSString *name;
@property NSInteger age;
@property BOOL isDirty;
- (void)startObserving;
- (void)stopObserving;
@end
@implementation MyObject
- (void)startObserving
{
NSArray *properties = self.objectSchema.properties;
for (RLMProperty *property in properties) {
[self addObserver:self forKeyPath:property.name options:NSKeyValueObservingOptionNew context:nil];
}
}
- (void)stopObserving
{
NSArray *properties = self.objectSchema.properties;
for (RLMProperty *property in properties) {
[self removeObserver:self forKeyPath:property.name];
}
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey,id> *)change
context:(void *)context
{
self.isDirty = YES;
}
+ (NSArray *)ignoredProperties {
return @[@"isDirty"];
}
@end
明らかに、あなたはより多くの私は(isDirty
が真に設定する必要がありますことを確認するために)行ってきたが、これはあなたのアイデアを与える必要がありますよりも、ここにチェックをやってみたいと思います。
管理対象のRealmオブジェクトがいつ作成されたかを自動的に知る本当の方法はないので、必要に応じて手動で監視を開始して停止することをお勧めします。
出典
2017-01-12 08:28:32
TiM
返信いただきありがとうございます。このようなことを試してみましたが、最終的にレルムが管理するオブジェクトを作成する場合は問題ありません。ただし、オブジェクトが**レルムから取得**されたときに、オブザーバを自動的にインストールする方法はありますか。レルムは常にクラスの '' init'メソッドを呼び出すとは限りません。それで、私たちはオブザーバーをそんな方法で取り付けることはできません。アプリケーションが自動的にオブザーバをインストールできるように、Realmの 'init'メソッドをインターセプトする方法はありますか? –
心配はいりません!ええ、それは私が最後に言いました。管理対象オブジェクトは、異なるプライベートAPIによってインスタンス化されるため、 'init'はそれらに対して呼び出されません。したがって、現時点では、内部APIを巧妙にオーバーライドするのに足りず、最も簡単な解決策は、観測を開始するときに手動で呼び出すことです。 – TiM
オブジェクトが初めて作成されたときにRealmがメソッドを呼び出す必要があると思うなら、http://github.com/realm/realm-cocoa/issuesでオブジェクトを作成することをお勧めします – TiM