簡體   English   中英

如何利用ios中的核心數據提高大數據導入性能

[英]How to improve large data import performance with core data in ios

我首次啟動iOS應用程序時,從Web服務導入~18,000個各種實體的記錄。 記錄在Web上的數據庫中有自己唯一的標識符。 我閱讀並重新閱讀了蘋果的文檔,cimgf的博客文章,Marcus Zarra關於核心數據的書籍,並一遍又一遍地觀看iDeveloper TV關於核心數據的系列文章。 我無法想出一種方法來導入實體A而不將實體B,C和D保留在內存中或執行昂貴的提取並維護實體之間的關系。 如果我沒有使用核心數據,我將能夠使用已經建立的唯一標識符,導入速度會快得多。

如果您有任何建議,我會全力以赴。

我們在Android中實現了這個策略,導入需要大約2.5分鍾,相比之下,iOS上大約需要6分鍾,不同設備上的硬件可以比較。 縮短導入時間對我們的用戶至關重要,因此我無法在此問題上妥協。 在此先感謝您的幫助。

編輯:

這就是我目前正在做的事情 - 我創建了一個NSOperation來創建它自己的上下文。 我首先導入實體B,C和D,並為每個實體類型保留一個數組。 然后我導入實體A並使用謂詞來過濾實體B,C和D的數組,以便將實體A與B,C和D中的相應實體相關聯。我是以優化的間隔批量保存上下文的。根據我當前導入的實體類型而有所不同。

我不只是導入到一個表,我導入了許多彼此相關的表。 因此,如果我導入實體B,我必須將實體B保留在內存中,或者在需要它時將實體B與實體A相關聯。有意義嗎?

我會在每個Core Data問題中提出相同的問題,然后繼續:確保你真的想要使用Core Data而不僅僅是sqlite。 核心數據用於持久化對象圖,而不是通用數據庫。 如果您已經為Android實現了數據庫,那么您可能希望在iOS上使用相同的架構和設計。

好的,把它弄清楚了。 讓我們假設CD確實是這里工作的最佳工具(或者你現在無法改變它)。 我在這里首先想到的是作弊。 當然,這通常是我早期的想法之一......

了解在沒有關系的情況下插入這些對象的速度有多快。 如果這個足夠快,那么這就是你作弊的方式:最初不要存儲實際關系。 存儲描述關系的標識符的字符串列表。 然后,一旦所有內容都加載並且用戶可以開始工作,隨着時間的推移將字符串關系轉換為后台中的真實關系。 每當你獲取一條記錄時,你需要檢查它是否仍然設置了騙子屬性,如果是,你需要手動獲取它的關系(然后清除騙子屬性)。

這並不能使完全導入更快,但它會讓人覺得它更快,這就是iOS中90%的目標。 你可能甚至必須阻止某些操作(比如刪除),直到你完成粘合所有內容,但這可能仍然比完全阻止用戶更好。

聽起來你正經歷着這個家伙經歷的同樣的痛苦,他最終扯掉了Core Data。 一定有更好的方法! http://inessential.com/2010/02/26/on_switching_away_from_core_data

我不是關於您正在關注的過程,但您是否考慮過使用塊和GCD(Grand Central Dispath)? 我想這是來自LinkedIn員工關於他們在iTunesU中的iPhone應用程序的演示。 如果我沒記錯的話,他們也在使用GCD。

“... GCD API,它支持在系統的Unix級別上異步執行操作。您可以使用此API來管理與文件描述符,Mach端口,信號或定時器的交互......”

https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM