각 쓰기 트랜잭션을 수행 한 후 수동으로 설정하는 관리되지 않는 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
확인이 진정으로 설정할 필요가 만들려면), 그러나 이것은 당신에게 아이디어를 줄 것이다.
관리되는 영역 오브젝트가 작성된시기를 자동으로 알 수있는 실제 방법이 없으므로 필요할 때 수동으로 시작하고 중지하는 것이 가장 좋습니다.
출처
2017-01-12 08:28:32
TiM
답장을 보내 주셔서 감사합니다. 우리는 이와 같은 것을 시도해 보았고 결국 영역에 의해 관리되는 객체를 생성하는 경우에 잘 작동합니다. 그러나 개체가 ** 영역 **에서 검색 될 때 옵저버를 자동으로 설치할 수있는 방법은 무엇입니까? Realm이 항상 클래스의 'init'메소드를 호출하지는 않습니다. 따라서 우리는 그런 식으로 관측자를 설치할 수 없습니다. 응용 프로그램이 Realm'init' 메소드를 인터셉트하여 옵저버를 자동으로 설치할 수있는 방법이 있습니까? –
걱정할 필요가 없습니다! 그래, 그게 내가 마지막에 말한거야. 관리되는 객체는 다른 개인 API에 의해 인스턴스화되므로 'init'이 호출되지 않습니다. 따라서 내부 API를 해킹하지 않는 한 가장 쉬운 방법은 관찰을 시작할 때 수동으로 호출하는 것입니다. – TiM
오브젝트가 처음 생성 될 때 호출되는 메서드가 Realm에 있어야한다고 생각하면 http://github.com/realm/realm-cocoa/issues에서 제안하는 것이 좋습니다. – TiM