我有一個Department
實體,它與Employee
實體有一對多的關係。在運行期間,對於每個Department
對象,我想維護一個Employee
對象(根據某個屬性排序)的排序數組,這些對象將在各種視圖對象中用作模型。核心數據背景排序
從我讀有兩種方式來表示排序後的數組:
REP1:在Department
限定取出的屬性(排序由核心數據完成);
REP2:保持系的實例變量sortedEmployees
(NSArray
Employee
對象)(排序是通過我的代碼完成)。
現在我真正的問題是,當應用程序啓動時,我有大量的Departments
和Employees
從持久存儲中獲取。我想在後臺執行排序操作,以免阻止用戶界面。
我嘗試了好幾種方法,這一切徒勞結束了:
方法一(使用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(及其關聯的託管對象)。
那麼,如果託管對象不能跨越線程邊界存在,那麼如何在後臺對所有託管對象進行排序呢?我錯過了什麼嗎?
謝謝。你可以根據行緩存詳細說明你的意思嗎?什麼行緩存? – Pius
另外,我應該在哪個線程中執行前面提到的陣列遷移?在主線程的情況下,當訪問mo.objectID時不會使「mo」失效,從而導致err錯誤?在後臺線程的情況下,不會訪問[moc objectWithID:...]有問題,因爲moc屬於主線程? – Pius
Pius,行緩存由持久性存儲協調器維護。這是一個自動性能優化。你不會維護它 - 核心數據呢。我通常在目標線程上轉換ID。 Andrew P.S.如果你喜歡這個答案,請記得選擇它作爲「正確的」答案。 – adonoho