2017-01-12 9 views
0

Может ли кто-нибудь предложить хороший образец для реализации грязного флага на объектах Realm? В частности, я хотел бы, чтобы каждый подкласс объекта Realm отображал флаг isDirty, который устанавливается, когда экземпляр класса модифицируется и очищается всякий раз, когда экземпляр записывается в облако (а не в Realm). Я работаю в Objective-C.Грязные флаги на объектах Realm

Возможные решения я могу думать о том, включают следующее:

  • Написать собственный сеттер для каждого свойства каждого объекта. Установите isDirty в каждом из этих сеттеров. Не очень желательно.
  • Используйте KVO в некотором роде. Две проблемы с этим подходом: (a) я не совсем понимаю, как реализовать этот подход, и (б) Realm не поддерживает KVO для управляемых объектов (которые в точности являются объектами, в которых я нуждаюсь).
  • Использование уведомлений в области. Опять же, у меня нет опыта в этом, и я не уверен, как использовать их для этой цели.

ответ

0

Если у вас нет управляемого isDirty имущества, которое вы установили вручную после выполнения каждой транзакции записи, KVO был бы лучшим способом.

Настройка индивидуальных настроек действительно будет невероятно запутанной. Вы должны иметь отдельный для каждого свойства, которое вы хотите отслеживать.

Уведомления о Realm будут работать только в том случае, если вы отслеживали набор объектов и хотели бы получать предупреждения, если они были изменены (с использованием 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, поэтому вам было бы лучше вручную запустить и прекратить наблюдение по мере необходимости.

+0

Спасибо за ответ. Мы действительно пробовали что-то вроде этого, и оно отлично работает в случае, когда мы создаем объекты, которые в конечном итоге становятся управляемыми Королевством. Однако как мы можем автоматически устанавливать наблюдателей, когда объекты ** извлекаются ** из Realm. Похоже, что Realm не всегда/никогда не называет методы 'init' нашего класса. Поэтому мы не можем установить наблюдателей таким образом. Есть ли способ для приложения перехватить методы 'init' Realm, чтобы он мог автоматически устанавливать наблюдателей? –

+0

Не беспокойтесь! Да, это то, о чем я говорил в конце. Управляемые объекты создаются с помощью другого частного API, поэтому 'init' не вызывается на них. Таким образом, на данный момент, за исключением хакерского переопределения внутреннего API, самым простым решением является вызов вручную, когда вы хотите начать наблюдение. – TiM

+0

Если вы считаете, что у Realm должен быть метод, вызываемый при создании объектов в первый раз, я бы рекомендовал предложить его по адресу http://github.com/realm/realm-cocoa/issues – TiM