2011-09-23 117 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