Realm对象上的脏标志

时间:2017-01-12 01:30:03

标签: objective-c persistence realm

有人能建议在Realm对象上实现脏标志的好模式吗?具体来说,我希望Realm Object的每个子类都公开一个isDirty标志,只要该类的实例被修改就会被设置,并且只要实例被写入云(而不是Realm)就会被清除。我在Objective-C工作。

我能想到的可能解决方案包括以下内容:

  • 为每个对象的每个属性编写自定义setter。在每个设置者中设置isDirty。不太理想。
  • 以某种方式使用KVO。这种方法存在两个问题:(a)我不完全了解如何实现这种方法,以及(b)Realm不支持托管对象的KVO(这正是我需要它的对象)。
  • 使用领域通知。同样,我没有这方面的经验,我不确定如何将它们用于此目的。

1 个答案:

答案 0 :(得分:1)

如果只是在执行每个写入事务后手动设置的非托管isDirty属性,KVO将是最好的方法。

设置自定义设置器确实会非常混乱。您必须为要跟踪的每个属性分别设置一个。

领域通知仅在您跟踪一组对象时才有效,并且如果有任何更改(使用collection notifications)或if anything in the Realm changed,则希望收到提醒。

使用KVO,您可能会获得对象子类本身以向其所有属性添加观察者,然后在任何属性更改时将其引导到一个方法,然后可以使用它来标记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对象,因此最好根据需要手动启动和停止观察。