2012-08-16 43 views
0

我在其中一個應用程序中廣泛使用核心數據。通常,對於UITableView,我使用NSFetchedResultsController。但是在一個特定的視圖控制器中,我需要顯示一些數據的總和 - 要求我首先獲取數據,然後創建一個for循環來分析數據並進行計算。但是,我認爲,如果我獲取大量的數據(比如說,每個包含NSString和float的10.000個對象),並且創建一個for循環,它可能會導致我的應用程序崩潰。這是一個嚴重的風險嗎?如果有,我該如何解決它? (我想創建一個NSAutoReleasePool,在計算後添加和釋放每個對象,但我使用ARC,所以我認爲我不能)。從核心數據中獲取大數據後的週期風險

+1

顯然取決於你的情況,但如果你需要一個簡單的SUM屬性,你可能想要做一個更具體的獲取,如這裏解釋http://stackoverflow.com/questions/6889646/calculating-a-simple-sum- with-core-data – 2012-08-16 15:27:52

+0

@PeterPajchl感謝您的回覆,但計算並不簡單=( – 2012-08-16 15:36:14

+0

在附註中,您仍然可以使用AutoReleasePools與ARC,它只是有點不同(搜索@autoreleasepool) – 2012-08-16 15:53:05

回答

1

使用自動釋放池在一個循環中這樣...

@autoreleasepool { 
    // Insert code in here 
} 

此外,你應該確保retainsRegisteredObjects是NO在你管理的對象上下文。此外,如果真的開始使用太多,可以通過釋放它們來手動控制故障refreshObject:mergeChanges:

0

我認爲你應該沒問題,你的建議循環。

通過設置獲取請求的batchSize,您可以指示Core Data始終獲取謹慎的數據量。核心數據然後會執行增量提取併爲您管理內存管理。

+1

如果他想迭代10000個對象,那麼你是怎麼做到的? @Mundi,即使是一個示例代碼的鏈接,這也是很有趣的。 – 2012-08-16 23:36:59

+0

@DavidH這很簡單。 'for(id obj in fetchedResults){}'。 – Mundi 2012-08-17 15:02:14

+0

我的觀點是,如果他一次讀入多個對象,由於沒有中間自動釋放池刷新,可能會佔用大量內存。 – 2012-08-17 18:08:15

0

您不需要從核心數據實體中獲取所有屬性,以執行所嘗試的複雜計算存檔。只需在你的NSFetchRequest上使用setPropertiesToFetch:這將允許你只提取你需要的屬性。此外,使用setBatchSize作爲您的獲取請求來告訴核心數據錯誤的對象以保持較低的佔用空間。