我仍然在努力處理核心數據堆棧中傳遞對象的最佳方法。如何我開始供參考:繞過核心數據堆棧傳遞
應用是超級簡單,單線程的核心數據訪問是完美的,只有少數的意見和各需要一個MOC。以創建Core Data Stack和一個MOC的示例代碼開始。 MOC存儲在App Delegate中。
應用程序開始變得越來越複雜,並最終意識到爲什麼在App Delegate中存儲MOC是一個糟糕的主意。重構的代碼在App Delegate中創建MOC,並將MOC注入根視圖控制器。從那裏開始,App Delegate沒有保留MOC,並且視圖控制器將其注入到可能需要它的其他控制器中。
開始重構故事板中的應用程序視圖。新的標籤欄,一些導航控制器,分割視圖控制器,你只知道一些不同的想法。步驟#2變成了一場噩夢。每當我對故事板中的應用程序視圖層次進行更改時,我都需要重新調整每個視圖控制器,以通過新層次結構傳遞MOC。當然,蘋果說這是正確的方式,但我不確定我是否購買它,非常難以在不殺死代碼的情況下進行簡單的視圖層級更改。現在我在我的應用程序的開頭有4個視圖,甚至不需要MOC。然而,這些視圖是應用程序委託人與需要MOC的視圖控制器的唯一鏈接。所以我被卡住注入MOC到所有這些視圖控制器中,以便它們可以將它傳遞給另一個視圖控制器,而無需每次使用MOC。
應用程序更加複雜,現在我想要一個線程化的核心數據堆棧。這意味着要傳遞持久性存儲,以便某些「處理」對象可以在後臺線程上創建自己的MOC。我應該創建一些可以幫助管理器的CoreDataStack對象嗎? I.E.的對象,我可以要求主線程MOC,或要求一個新的'工人'背景MOC。看起來像現在第3步更加毫無意義,我的意思是我的應用程序中的每個視圖都需要訪問主線程MOC,而不是其他任何東西。我想我沒有看到這一個改變了一段時間,但誰知道我已經改變了很多,因爲我開始;)
我覺得「CoreDataStack」對象可以管理分佈的想法MOC可能是一個好主意。這樣,至少該對象可以抽象出我選擇實現線程堆棧的方式的實現細節。 I.E.提供方法來掏出主要的MOC和背景MOC。
這似乎很好,直到我開始考慮如何傳遞這個堆棧對象。我可以做到蘋果推薦的內容,並將其從控制器傳遞到控制器,將主線程MOC注入到每個視圖控制器中。但正如我上面所說的,在故事板上重新工作大約5分鐘,這使得這種情況迅速崩潰。更不用說將MOC傳遞給並不真正需要的視圖,以便它們可以傳遞到層次結構中可能需要它的下一個視圖。
最後我的問題。是否有更好的解決方案,而不是傳遞/注入MOC到每個視圖控制器?
使用核心數據和多線程環境中的對象可能會非常複雜。看看Magical Record,它會消除很多痛苦。 https://github.com/magicalpanda/MagicalRecord – sbarow 2014-10-22 05:00:28
2是首選方式,特別是在使用嵌套上下文時。通過使用非正式協議,您可以使您的實施更輕鬆。如果遵循規則併爲不同的工作機構創建新的上下文,併發不應該引入問題。 http://quellish.tumblr.com/post/97430076027/a-real-guide-to-core-data-concurrency – quellish 2014-10-23 02:12:58