2011-07-22 31 views
0

我正在使用Core Data作爲tableview。我的數據按距離當前位置的距離排序。我想要的是爲5,10和20英里的物品製作一個新的部分。距離組NSFetchedResultsController節

我的距離值作爲NSInteger存儲在數據存儲中,我在對象模型中使用NSNumber將其取出。

我已經做了一些四處搜索,發現我需要使用sectionNameKeyPath屬性來分割數據。

我的問題是,我不知道分組數據的最佳方式。在我的搜索過程中,我遇到了一個瞬態屬性或使用一個NSNumber類別來確定該項目應該在哪個部分。

這兩種方法中的哪一種都是獲得最終結果的最佳方法,如果有的話,是否有人提供有關如何實施它的任何細節?

謝謝。

回答

1

您應該向對象添加派生屬性(它在模型中不是嚴格需要的),我們將其命名爲range。我會讓它成爲只讀屬性,您可以緩存值或不。

當它是0-5,回報5,5.x的 - 10回10,等等

然後設置range爲您sectionNameKeyPath

+0

感謝您的回覆。對不起,如果我在這裏有點笨,但是當你說一個「派生屬性」時,你的意思是在我的數據模型對象的.h文件中,我做了這樣的事情:@property(monatomic,readonly)NSInteger * range;另外,我是否需要創建自己的getter方法來返回5,10或20? –

+0

這種方法可以工作,但它是一個快速和骯髒的修復,混淆了用戶界面和模型。通常,您不希望使用視圖圖層的實現細節來污染模型圖層。如果你有幾個tableview全部由不同屬性的範圍定義的部分會發生什麼?你會有多個派生屬性,每個tableview一個。當你想在另一個應用程序中使用數據模型會發生什麼?儘可能保持模型和視圖儘可能分離是最佳實踐。 – TechZen

+0

scrooby,是的。 @TechZen,同意。但是在使用FetchedResultsController的同時,你有更好的方法來管理這個嗎?我很想知道它(因爲你陳述的原因)。 - - - 的「清潔設計」選項,現在是自己實現所有的委託方法,扔掉FetchedResultsController只有使用FetchedResults - 這是更多的工作,以獲得「清潔設計」,司寇你來決定的位置是這是期望的。正如TechZen所說,如果有很多可能性,你可能不希望推入模型。 – bshirley

0

如果您想要高度自定義的節行爲,您需要繼承NSFetchedResultsController的子類以爲您提供所需的行爲。有關詳細信息,請參閱NSFetchedResultsController類文檔。

您需要在這種情況下的子類,因爲你不看像一個字符串屬性的按字母順序排列的第一個字母,而是在每一個屬性落入範圍內的單一有序屬性。

這是不是改變數據模型,因爲你可以用它來顯示在許多不同的tableviews數據許多不同的方式,而無需攪渾了你的數據模型一個清晰的解決方案。

+0

感謝您的評論,你知道的繼承NSFetchedResultsController的任何很好的例子? Apple文檔確實提到了您可以繼承的方法,但我看不到任何示例。 –

+0

對不起,這些都是如此的自定義,我不認爲人們做了很多例子。我不確定自己如何實現你想要的。讓我想想。 – TechZen