2017-01-12 5 views
0

誰もレルムオブジェクトにダーティーフラグを実装するための良いパターンを提案できますか?具体的には、クラスのインスタンスが変更されるたびに設定されるisDirtyフラグを公開するよう、Realm Objectのすべてのサブクラスに情報を提供したいと考えています。私はObjective-Cで働いています。レルムオブジェクトのダーティフラグ

  • は、すべてのオブジェクトのすべてのプロパティのカスタムセッターを書く:私は考えることができる

    可能な解決策は、以下のものが含まれます。それぞれの設定者の中にisDirtyを設定します。それほど望ましくない。

  • 何らかの方法でKVOを使用してください。このアプローチの2つの問題:(a)このアプローチを実装する方法を完全に理解していない。(b)Realmはマネージドオブジェクト(これが必要なオブジェクト)にKVOをサポートしていない。
  • レルム通知を使用します。繰り返しますが、私はこれらの経験がなく、この目的のためにそれらをどのように使用するのか分かりません。

答えて

0

各書き込みトランザクションを実行した後に手動で設定した管理されていない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オブジェクトがいつ作成されたかを自動的に知る本当の方法はないので、必要に応じて手動で監視を開始して停止することをお勧めします。

+0

返信いただきありがとうございます。このようなことを試してみましたが、最終的にレルムが管理するオブジェクトを作成する場合は問題ありません。ただし、オブジェクトが**レルムから取得**されたときに、オブザーバを自動的にインストールする方法はありますか。レルムは常にクラスの '' init'メソッドを呼び出すとは限りません。それで、私たちはオブザーバーをそんな方法で取り付けることはできません。アプリケーションが自動的にオブザーバをインストールできるように、Realmの 'init'メソッドをインターセプトする方法はありますか? –

+0

心配はいりません!ええ、それは私が最後に言いました。管理対象オブジェクトは、異なるプライベートAPIによってインスタンス化されるため、 'init'はそれらに対して呼び出されません。したがって、現時点では、内部APIを巧妙にオーバーライドするのに足りず、最も簡単な解決策は、観測を開始するときに手動で呼び出すことです。 – TiM

+0

オブジェクトが初めて作成されたときにRealmがメソッドを呼び出す必要があると思うなら、http://github.com/realm/realm-cocoa/issuesでオブジェクトを作成することをお勧めします – TiM

関連する問題