2012-02-11 23 views
0

假設我有一個基本的iPhone應用程序來維護聯繫人。我有一個名爲「聯繫人」的實體,具有屬性「名稱」,「地址」和「照片」。該應用程序的主視圖只是顯示每個聯繫人姓名的表格視圖。用戶可以點擊每個名稱來顯示相應的照片和地址(在一個單獨的視圖控制器中)。一個簡單的方法可以讓核心數據讀取更好一點

問題是,照片​​可能有一個非常大的尺寸。

當我獲取託管對象時,它的所有屬性是否也會被帶入內存?在這種情況下,加載應用程序並在表格視圖中顯示名稱可能需要很長時間,因爲該應用程序也在獲取所有照片(和地址)之下,對嗎?

由於這個原因,你不應該說我應該 - 爲了使主視圖更加靈活(並且應用程序加載速度更快) - 創建一個僅具有「名稱」屬性的新「ContactFacade」實體和關係到「聯繫」實體,其中包含有關該聯繫人的更多詳細信息?

+0

標記爲http://stackoverflow.com/questions/2131722/coredata-for-iphone-storing-images – bneely 2012-02-11 02:08:41

回答

1

安吉拉卷,

大的Blob應始終在 「葉子」 的實體。一個葉子實體只包含NSData BLOB和反向關係,這也允許你很容易地利用iOS v5/Mac OS X Lion在文件系統中的自動BLOB保存,通過這樣做,你可以在加載時明確地進行控制,就像重要的是,通過明智地使用-refreshObject:mergeChanges:,您可以強制BLOB從內存以及潛在的行緩存中執行。這一改變將顯着提高您的讀取和加載性能。 BLOBs是它不使用內存映射來打開大文件,這會影響你在內存中的佔用空間。當內存警告來臨時,您將需要顯式卸載這些BLOB,並且它們會到來。

安德魯

1

核心數據將爲您呈現這些東西 - 它不會獲取所有照片等,直到您真正需要展示它們。用戶界面不會阻止。

例如,請查看iTunes U中的斯坦福iOS類,特別是核心數據講座和核心數據演示(講座13和14)。他們甚至有一個CoreDataTableViewController,您可以輕鬆地連接到我當前項目中使用的FetchResultsController。

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/node/289

該示例應用的存在不僅顯示大的照片,它有效地做它從網絡。

享受,

達明

4

而不是存儲在覈心數據的圖像,將它們存儲爲磁盤上的文件,並只存儲在覈心數據的文件名。

如果您使用UIImage從文件中讀取圖像,它將自動從ram中刪除自身,並根據需要將其自身重新加載到ram中。

如果你想要非常好的表現,你應該確保圖像較小,或者可能有兩種尺寸(拇指和全尺寸)。

另外,請注意您應該使用的圖像格式。 PNG將使用更多的磁盤空間,但與JPEG相比,它需要更少的CPU渲染時間。

0

蘋果有自己的Core Data Performance頁面稱爲「大數據對象(BLOB)的」上一小部分。感興趣的部分是:

爲小到適度規模的BLOB(和CLOB),你應該創建一個用於數據的 獨立的實體,並創建在該屬性的地方 一個一對一的關係。

實施此更改後,我在應用程序中看到了出色的性能改進。但是,我處於需要在地圖上顯示的單個請求中獲取300多個對象的情況。在您的情況下,您可以使用NSFetchedResultsController來管理表格中的數據,這會將提取限制爲一小部分數據。