0

我一直與NSFetchedResultsController做一些惡夢,並試圖找到解決我的問題概述here,我遇到了一個不尋常的關於fetchedResultsController,特別是sectionNameForKeypath參數提取的數據。NSFetchedResultsController - sectionNameForKeypath如何獲取其數據?

假設我有2個實體和按下面的關係的對象模型:

項目 < < - >類別

類別具有(NSNumber的*)屬性稱爲displayOrder這是用於將提取的項目實例分成表格視圖中的部分:

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] 
              initWithFetchRequest:fetchRequest 
              managedObjectContext:moc 
              sectionNameKeyPath:@"category.displayOrder" 
              cacheName:nil]; 

如果我想以某種方式動態地操作displayOrder的輸出,顯然的選擇是覆蓋其getter方法並在其中執行任何我想要的操作。但問題是,displayOrder的getter在fetchRequest或fetchedResultsController中根本不會被訪問,即使我在sectionNameForKeypath中指定它,AND我可以看到fetchedResultsController正在使用它的值來分隔和顯示這些部分。

下面是覆蓋的getter方法的一個簡單例子,它永遠不會被調用。這是把我的範疇類中:

-(NSNumber*)displayOrder 
{ 
    NSLog (@"displayOrder getter called"); 
    NSNumber *displayOrder = [NSNumber numberWithInt:0]; 
    return displayOrder; 
} 

我也嘗試覆蓋awakeFromFetch無果(也不會被調用,而是因爲我獲取項目情況和訪問並不讓我感到吃驚類別及其屬性通過關係)。

因此,最後我的問題是:category.displayOrder值如何傳遞給我的fetchedResultsController,並有沒有辦法讓我來控制這個輸出?

在此先感謝您的任何想法!

羅格

回答

1

由於iOS的3.2,NSFetchedResultsController使用由sectionNameKeyPath標識的字段直接從數據庫中只要有可能,而不是爲每個項目創建對象。您可以嘗試爲sectionNameKeyPath使用非持久性屬性,根據文檔,該屬性會強制它創建對象,但是如果只是爲UITableView重命名這些部分,則最好在該對象中執行映射tableView:titleForHeaderInSection:

+0

感謝您的澄清Anomie!你有鏈接到文檔討論的地方嗎?乾杯! – Rog 2011-03-20 23:54:43

+0

[Here you go](http://developer.apple.com/library/ios/#DOCUMENTATION/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW33) – Anomie 2011-03-21 00:07:45