2011-09-23 71 views
16

假设我有两个实体,员工和部门。一个部门与员工有多对多的关系,许多员工可以在每个部门,但每个员工只属于一个部门。我想使用NSFetchedResultsController在一个tableview中显示所有员工,这些员工是属于他们所属部门的数据。问题是我希望我的表在部门对象接收到更改时进行更新,就像员工的常规属性发生更改一样,但FetchedResultsController似乎没有跟踪相关对象。我已经得到了通过以下操作部分通过此问题:NSFetchedResultsController关系不更新

for (Employee* employee in department.employees) { 
    [employee willChangeValueForKey:@"dept"]; 
} 

/* Make Changes to department object */ 

for (Employee* employee in department.employees) { 
    [employee didChangeValueForKey:@"dept"]; 
} 

这显然是不理想的,但它确实会导致员工基于FRC的委托方法didChangeObject到被调用。我现在已经离开了真正的问题是在分选FRC是跟踪员工的对象:

NSEntityDescription *employee = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"department.someProperty" ascending:NO]; 

这个伟大的工程和排序正确的员工在第一时间它被称为,问题是,当我进行更改部门某些属性应该改变我的员工表的排序没有任何反应。有什么好办法让我的员工FRC跟踪关系中的变化?特别是,我只是需要一些方法让它在排序基于相关属性时更新排序。我已经浏览了一些类似的问题,但无法找到令人满意的解决方案。

回答

16

NSFetchedResultsController实际上只能用于一次观察一个实体。你的设置虽然很有意义,但它有点超出了NSFetchedResultsController目前能够独立观看的程度。

我的建议是建立你自己的观察者。你可以根据我在GitHub上设置的ZSContextWatcher来建立它,或者你可以使它更加简单。

基本上你想看NSManagedObjectContextDidSaveNotification张贴,然后当包含你的部门实体的人触发时重新载入你的表格。

我还建议向苹果提交rdar,并要求改进NSFetchedResultsController

+0

不确定您是否希望设置FRC来同时观看多个实体。排列会变得很大而且很匆忙。你也可能有圆形问题。 – TechZen

+0

我遇到过iPad需要观看多个实体来维护状态的情况。这是这个想法最初来自哪里。 –

+0

我会赞成中学或小类。您添加到基类的复杂性越高,他就越需要管理和调试。 – TechZen