有人能建议在Realm对象上实现脏标志的好模式吗?具体来说,我希望Realm Object的每个子类都公开一个isDirty
标志,只要该类的实例被修改就会被设置,并且只要实例被写入云(而不是Realm)就会被清除。我在Objective-C工作。
我能想到的可能解决方案包括以下内容:
isDirty
。不太理想。答案 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对象,因此最好根据需要手动启动和停止观察。