2017-01-12 15 views
0

누구든지 영역 객체에서 더티 플래그를 구현하기위한 좋은 패턴을 제안 할 수 있습니까? 특히, 클래스의 인스턴스가 수정 될 때마다 설정되는 isDirty 플래그를 노출하는 영역 객체의 모든 하위 클래스를 (인스턴스가 클라우드에 작성 될 때마다) 제거됩니다 (영역이 아님). 나는 Objective-C에서 일하고있다.영역 객체의 더티 플래그

  • 모든 객체의 모든 속성에 대해 사용자 지정 세터 쓰기 : 내가 생각할 수있는

    가능한 해결책은 다음과 같습니다. 각 설정자 내에서 isDirty을 설정하십시오. 별로 바람직하지 않습니다.

  • 어떤 방식 으로든 KVO를 사용하십시오. 이 접근법의 두 가지 문제점 : (a)이 방법을 구현하는 방법을 완전히 이해하지 못했으며 (b) 영역이 관리 대상 객체 (정확하게 필요한 객체)에 대한 KVO를 지원하지 않습니다.
  • 영역 알림을 사용하십시오. 다시 말하지만, 저는 이것들에 대한 경험이 없기 때문에 이것을 어떻게 사용하는지 모르겠습니다.

답변

0

각 쓰기 트랜잭션을 수행 한 후 수동으로 설정하는 관리되지 않는 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 확인이 진정으로 설정할 필요가 만들려면), 그러나 이것은 당신에게 아이디어를 줄 것이다.

관리되는 영역 오브젝트가 작성된시기를 자동으로 알 수있는 실제 방법이 없으므로 필요할 때 수동으로 시작하고 중지하는 것이 가장 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 우리는 이와 같은 것을 시도해 보았고 결국 영역에 의해 관리되는 객체를 생성하는 경우에 잘 작동합니다. 그러나 개체가 ** 영역 **에서 검색 될 때 옵저버를 자동으로 설치할 수있는 방법은 무엇입니까? Realm이 항상 클래스의 'init'메소드를 호출하지는 않습니다. 따라서 우리는 그런 식으로 관측자를 설치할 수 없습니다. 응용 프로그램이 Realm'init' 메소드를 인터셉트하여 옵저버를 자동으로 설치할 수있는 방법이 있습니까? –

+0

걱정할 필요가 없습니다! 그래, 그게 내가 마지막에 말한거야. 관리되는 객체는 다른 개인 API에 의해 인스턴스화되므로 'init'이 호출되지 않습니다. 따라서 내부 API를 해킹하지 않는 한 가장 쉬운 방법은 관찰을 시작할 때 수동으로 호출하는 것입니다. – TiM

+0

오브젝트가 처음 생성 될 때 호출되는 메서드가 Realm에 있어야한다고 생각하면 http://github.com/realm/realm-cocoa/issues에서 제안하는 것이 좋습니다. – TiM