2014-11-13 9 views
0

ProjectPath이라고 말합니다. Project에는 여러 경로가 있습니다 (선택 사항). Paths은 많은 프로젝트 (non-optional, min = 1)에 속할 수 있습니다. Path에 연결된 마지막 Project을 보관하는 경우 Path도 보관해야합니다. 그러나 Path이 다른 활성 프로젝트에 속한 경우 보관하지 마십시오.코어 데이터 마지막 ​​자식 개체에 대한 다 대다 케스케이드 보관 (휴지통)

"보관"은 archivedDate 속성을 설정하는 것과 같습니다.

내 유일한 접근 방식은 영구적 인 스택이 코어 데이터 알림 (어떤 것이 확실하지는 않지만)을 구독하고 저장시 영향을받는 Path 개체를 검사하고 보관 규칙을 적용하는 것입니다.

"캐스케이드"보관을 구현하려면 어떻게해야합니까?

답변

1

Project 클래스에서 setArchivedDate을 간단하게 무시할 수 있다고 생각합니다.

-(void)setArchivedDate:(NSDate*)newValue { 
    [self willChangeValueForKey:@"archivedDate"]; 
    [self setPrimitiveValue:newValue forKey:"archivedDate"]; 
    [self didChangeValueForKey:@"archivedDate"]; 

    for (Path *path in self.paths) { 
     NSSet *activeProjects = [path.projects filteredSetUsingPredicate: 
     [NSPredicate predicateWithFormat:@"archivedDate = nil"]]; 
     if (!activeProjects.count) { 
     path.archivedDate = newValue; 
     } 
    } 
} 

PS처럼 뭔가를 거기 당신은 모든 경로의 상태를 확인할 수 있습니다 따라 보관 : 당신은 스위프트를 사용하는 경우, 이것은 didSet에서 이루어집니다.

+0

값을 설정하면 부작용이 생기지 않습니다. 클린업 단계는 KVO를 사용하는 것입니다. 나는'activeProjects'가 지금까지 필터링을 설정하는 것을 좋아합니다! – ctietze

+0

값을 논리적으로 설정하면이 효과가 발생하므로 ** 설정자를 재정의하는 데 "편안함"을 느껴야합니다. 이것은 코어 데이터 객체 그래프 관리에서 매우 공통적 인 패턴입니다. – Mundi