5

我對Core Data還是比較新的,並且試圖理解爲什麼它需要傳遞一個NSManagedObjectContext。據我所知,傳遞上下文是需要的,以便多個線程不會影響相同的上下文,但我也覺得這種模式有時被認爲是反模式,如here上下文模式?爲什麼Core Data需要它?

核心數據理論上可以以避免使用這種模式的線程安全方式實現嗎?其他ORM(例如Ruby的ActiveRecord)如何避免這種模式?例如,CoreData不能實現每個NSManagedObject保存方法,例如在extension中。這個輕量級框架並不處理多線程,但是NSManagedObjects不能使用某種內部GCD隊列來支持它,並且不會暴露內部上下文嗎?

對不起,如果我錯過了任何重大事件。

+1

+1爲好問題。我知道,大背景往往被視爲反模式,但在我看來,蘋果並沒有濫用它,就像一個初級程序員通過屋頂瓦片只是爲了衝入浴室廁所一樣。 NSManagedObjectContext確實管理很多事情,但通過方法,並不要求你的所有實體一次可用,或者2個實體共享相同的模型來相互瞭解。 – Joe

回答

5

NSManagedObjectContext是應用程序對象圖的內存容器,就像持久性存儲(XML,SQLite等)通常表示對象圖的磁盤容器一樣。

有一些優勢,這種方法:

  1. 斷裂作用可以應用於一組對象,或在CoreData的情況下,整個對象圖
  2. 這對於迫使應用到方便的抽象批量它是I/O。
  3. 它爲在整個對象圖上有效執行操作提供了一個單一的聯繫點(NSFetchRequests等)。
  4. 撤銷可以應用於對象圖,而不僅僅是單個對象。

重要的是要記住,CoreData不是一個ORM框架,它是一個對象持久性框架。 CoreData的主要職責是使訪問存儲在磁盤上的永久格式的數據更有效。但是它並不試圖模擬關係數據庫的功能。

關於併發性,在即將發佈的Mac OSX版本中引入了新的併發模型。你可以在developer.apple.com上閱讀更多。

儘管如此,爲託管對象上下文選擇的併發模型與上下文模式本身有關的單個應用程序的細節更多。 NSManagedObjectContext的實例通常不應該在線程之間共享。

以同樣的方式,每個線程需要它自己的NSAutoReleasePool實例,每個線程也應該有它自己的MOC。這樣,當線程完成執行時,它可以將其更改提交到磁盤上的存儲,然後釋放上下文,釋放線程上處理的對象所消耗的所有內存。

這比在給定應用程序的生命週期中允許單個上下文連續佔用系統資源更有效。當然,這也可以通過在上下文中調用-reset來完成,這將導致上下文使用的所有NSManagedObject被重新轉換爲錯誤。

0

每個線程需要一個NSManagedObjectContext。所以你可以在主線程中填充你的UI,對於每個後臺線程你可以使用另一個更長的操作。如果你想要從其他線程中合併結果,那麼你可以訂閱一個通知,該通知提供了一些可以快速合併被更改爲主要MOC的內容。

+0

與自己合併與否(如果CoreData提供它)設置一種合併策略並讓它自己合併內部創建的對象會有優勢嗎?看起來,如果它可以做到這一點,它將使API使用它更簡單。 – donalbain

相關問題