3

我有一個Department實體,它與Employee實體有一對多的關係。在運行期間,對於每個Department對象,我想維護一個Employee對象(根據某個屬性排序)的排序數組,這些對象將在各種視圖對象中用作模型。核心數據背景排序

從我讀有兩種方式來表示排序後的數組:

REP1:在Department限定取出的屬性(排序由核心數據完成);

REP2:保持系的實例變量sortedEmployeesNSArrayEmployee對象)(排序是通過我的代碼完成)。

現在我真正的問題是,當應用程序啓動時,我有大量的DepartmentsEmployees從持久存儲中獲取。我想在後臺執行排序操作,以免阻止用戶界面。

我嘗試了好幾種方法,這一切徒勞結束了:

方法一(使用REP1):在後臺線程(使用NSOperationQueue),獲取所有Departments,然後執行每個人的獲取財產。然後返回主線程,在主線程的託管對象上下文(MOC)(由NSManagedObjectID)查找對應的Department對象並使用fetched屬性。 Method1問題:即使在後臺Department的抓取完成後,主線程的Department對象中的抓取屬性也不會填充,這意味着它會在主線程Department中重新抓取!這打破了背景獲取的全部目的。假設在所有MOC中都存在提取的屬性,我錯了嗎?

方法2(使用REP2):在後臺線程(使用NSOperationQueue),獲取所有Departments,然後計算每一個的sortedEmployees陣列。然後回到主線程中,在主線程MOC(由NSManagedObjectID)和找到對應的Department對象,將上述數組設置爲此對象。 Method2問題:sortedEmployees數組中的對象是Employee屬於後臺線程的對象MOC。當主線程稍後嘗試訪問它們時,會發生類似"NSManagedObject with ID ... has been invalidated."這樣的崩潰,這是因爲每個線程都必須具有自己的MOC(及其關聯的託管對象)。

那麼,如果託管對象不能跨越線程邊界存在,那麼如何在後臺對所有託管對象進行排序呢?我錯過了什麼嗎?

回答

1

皮烏斯,

你不會錯過任何東西。你只需要將你的排序數組轉換爲新的MOC。這是一個片段:

NSMutableArray *ma = [NSMutableArray arrayWithCapacity: array.count]; 

for (mo in array) { 

    [ma addObject: [moc objectWithID: mo.objectID]]; 
} 
return ma; 

這將遷移您的數組。據我瞭解,這是一個有效的過程。此外,您可以依賴行緩存來實現對屬性的高性能訪問。

Andrew

+0

謝謝。你可以根據行緩存詳細說明你的意思嗎?什麼行緩存? – Pius

+0

另外,我應該在哪個線程中執行前面提到的陣列遷移?在主線程的情況下,當訪問mo.objectID時不會使「mo」失效,從而導致err錯誤?在後臺線程的情況下,不會訪問[moc objectWithID:...]有問題,因爲moc屬於主線程? – Pius

+0

Pius,行緩存由持久性存儲協調器維護。這是一個自動性能優化。你不會維護它 - 核心數據呢。我通常在目標線程上轉換ID。 Andrew P.S.如果你喜歡這個答案,請記得選擇它作爲「正確的」答案。 – adonoho