Core data 最后一个子对象的核心数据多对多级联存档(垃圾)

Core data 最后一个子对象的核心数据多对多级联存档(垃圾),core-data,many-to-many,cascade,Core Data,Many To Many,Cascade,假设我有项目和路径项目有许多路径(可选)路径可以属于许多项目(非可选,最小值为1)。当我归档与路径关联的最后一个项目时,路径也应该归档。但是,当路径属于另一个活动项目时,不应将其存档 “存档”等于设置archivedDate属性 我的天真方法是:持久堆栈订阅核心数据通知(但不确定是哪一个),在保存时检查受影响的Path对象,并强制执行存档规则 如何实现“级联”归档?我认为您可以简单地覆盖项目类中的setArchiveDate。在那里,您可以检查所有路径的状态,并相应地进行归档,例如 -(void

假设我有
项目
路径
<代码>项目有许多路径(可选)<代码>路径可以属于许多项目(非可选,最小值为1)。当我归档与
路径
关联的最后一个
项目
时,
路径
也应该归档。但是,当路径属于另一个活动项目时,不应将其存档

“存档”等于设置
archivedDate
属性

我的天真方法是:持久堆栈订阅核心数据通知(但不确定是哪一个),在保存时检查受影响的
Path
对象,并强制执行存档规则


如何实现“级联”归档?

我认为您可以简单地覆盖
项目
类中的
setArchiveDate
。在那里,您可以检查所有路径的状态,并相应地进行归档,例如

-(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:如果您使用的是Swift,这是在
didSet

中完成的,我对设置该值的副作用感到不舒服。例如,我想清理步骤应该是使用KVO。到目前为止,我喜欢
activeProjects
set筛选!如果逻辑上设置该值具有这种效果,那么覆盖setter应该会让您感到“舒服”。这是核心数据对象图管理中非常常见的模式。