我的應用程序顯示了一個映射,其中包含從核心數據中提取的註釋。目前,我在地圖的viewDidLoad中做performFetch
,但是,當我在tabViewController中選擇它的選項卡時,這會延遲地圖從屏幕上立即出現。有沒有更適合撥打performFetch
的地方,還是有什麼我做錯了?它從Core Data返回約250個對象。我應該爲哪些視圖生命週期方法執行提取核心數據?
感謝
我的應用程序顯示了一個映射,其中包含從核心數據中提取的註釋。目前,我在地圖的viewDidLoad中做performFetch
,但是,當我在tabViewController中選擇它的選項卡時,這會延遲地圖從屏幕上立即出現。有沒有更適合撥打performFetch
的地方,還是有什麼我做錯了?它從Core Data返回約250個對象。我應該爲哪些視圖生命週期方法執行提取核心數據?
感謝
除了/而不是運行線程外,您可以將抓取限制爲小批量,例如10個對象。然後獲取10個對象,顯示它們,然後獲取下10個對象,依此類推。這會讓你的界面保持活躍,用戶會明白他們正在觀看漸進的過程。
使用-[NSFetchRequest setFetchLimit:]
來限制每次讀取返回的對象的數量,並使用-[NSFetchRequest setFetchOffset:]
來索引後續讀取。
從Apple文檔上fetchOffset:
The default value is 0.
This setting allows you to specify an offset at which rows will begin being returned. Effectively, the request will skip over the specified number of matching entries. For example, given a fetch which would normally return a, b, c, d, specifying an offset of 1 will return b, c, d, and an offset of 4 will return an empty array. Offsets are ignored in nested requests such as subqueries.
This can be used to restrict the working set of data. In combination with -fetchLimit, you can create a subrange of an arbitrary result set.
你也可能想看看你的核心數據對象圖設計。 250個對象不是很多,並且處理這些許多對象不應該有顯着的性能問題。您可能需要將大量數據塞進一個實體中,因此您必須在很多不需要的數據中進行錯誤處理以獲取一些相對較小的信息。
例如,常見的錯誤是將大量數據(如圖像)的屬性添加到通常訪問的實體(如Person實體)中。這會導致問題,因爲要獲取Person.name屬性,還必須加載數百KB的圖像。
一個更好的設計是將大的屬性放在自己的實體中,並鏈接到其他實體作爲關係。這樣,當您明確調用關係時,只有大數據塊發生故障。在上面的例子中,你會把圖像放在它自己的實體中。這樣,當你想要Person.name時,你只需要輕量級文本中的錯誤。
還有其他地方,如viewDidAppear:
但他們也鎖定了用戶界面,如果你長時間運行的查詢。
你可以做的一件事是在後臺線程上執行fetch,然後讓視圖控制器在主線程上顯示數據。
謝謝,我在後臺線程上執行了獲取並且很好地工作。 – conorgriffin 2010-03-07 13:50:31
感謝TechZen這個偉大的答案,250個對象只包含字符串和數字值。沒有圖像或類似的東西。但是,我在'fetchRequest'方法中放置了一些代碼,將每個返回的對象放在地圖上。也許這是性能影響的地方是 – conorgriffin 2010-03-07 14:01:21
聽起來像是導致該問題的250個addAnnotation調用。嘗試將日誌語句放在方法中,找出實際存在的瓶頸,然後從那裏進行編碼。使用核心數據時,您要撤回的數據應該是瞬間的。 – 2010-03-07 14:36:00
我不認爲你這樣做,但你絕對不想獲取單個對象,將其放置在UI中,然後獲取下一個單獨的對象。即使只有少量的對象也會永遠持續下去,因爲每次搜索整個數據庫時都需要一個對象。相反,執行可管理大小的提取,顯示每個提取返回的所有對象,然後根據需要重複。 – TechZen 2010-03-07 16:39:39