2014-09-23 55 views
22

唯一的(和最近的)結果我發現的最佳做法在這裏:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdConcurrency.html更新的核心數據併發性文檔?

然而,頁面的最頂端說,

「重要提示:最佳實踐併發核心數據已自從寫這篇文章以來,它發生了巨大的變化;請注意,本章並不代表當前的建議。「

我在哪裏可以找到更多關於核心數據併發性的最新文檔?

+0

這不是Apple文檔,但您可能會發現它很有幫助:http://quellish.tumblr.com/post/97430076027/a-real-guide-to-core-data-concurrency – quellish 2014-09-24 02:40:26

+0

對此有10億投票題。 – Benjohn 2015-05-21 13:34:45

回答

7

最好的討論現在在NSManagedObjectContext documentation內的「併發」下。

我的概要:

螺紋禁閉仍然是必需的。 iOS 5/OS X v10.7引入的巨大變化是,上下文現在可以有其他上下文作爲父母,並且可以管理自己的串行隊列。

保存後,更改會自動從子級遷移到父級。這就是現在節省的手段。只有當你的父母是持久性存儲時,你實際上是在向磁盤提交。

因此,通過通知進行同步的所有內容都是Apple不希望您遵循的內容。所有這些機制仍然可用,但蘋果已將最常見的模式直接引入框架。

+0

「仍然需要線程限制。」事實並非如此,線程監禁已經過時了一段時間。隊列禁閉已經被推薦了一段時間。 – quellish 2014-10-15 02:14:35

+0

相反,Apple一直明確表示:「注意:您可以使用線程,串行操作隊列或派發隊列來實現併發性。爲了簡潔起見,本文全文使用」線程「來指代其中的任何一個。在討論核心數據時,線程限制和隊列限制是同義詞,前者是首選的語句 - 準確地或以其他方式。 – Tommy 2014-10-15 02:19:37

+0

您提到的文檔已過時,並且在引入隊列限制之前編寫得很好。這就是爲什麼在你引用文檔的最頂端說明:「自從寫這篇文檔以來,與Core Data併發的最佳實踐發生了巨大變化;請注意,本章並不代表當前的建議。」線程限制和隊列限制是CD併發的不同範式 - 它們不是同義詞。 – quellish 2014-10-15 20:12:29

2

線程限制已被廢棄。你可以在頭看到了NSManagedObjectContext

NSConfinementConcurrencyType  = 0x00, /* this option is obsolete and not recommended for new code. */ 

當用-init創建一個背景下,它會調用初始化-initWithConcurrencyType:的說法NSConfinementConcurrencyType。這是關於併發性的核心數據編程指南部分中描述的線程模型,已經過時並且不推薦一段時間。用一位核心數據工程師的話說:「它只是沒有用。」

不幸的是,核心數據編程指南還沒有更新,以描述目前推薦的併發和其他進步的最佳做法。 但是,嘿,至少它不會告訴你使用鎖定!

Incremental Store Programming Guide已於近日更新。它描述瞭如何實現一個NSIncrementalStore,並且在解釋Core Data的一些內部方面做了很好的工作。例如,它描述了什麼是故障,以及如何發現故障比Core Data編程指南所做的更好。過去的several years核心數據發佈說明包含了一些關於最佳實踐的更新信息,並且有幾個與核心數據相關的技術說明。

過去幾年中最好的信息是WWDC每年一度的「核心數據新特性」會議。對於併發性,您應該查看以下WWDC會話:

WWDC 2011 What's new in Core Data on MacOS X。 MacOS X會話比iOS會話更詳細一些。

WWDC 2012 Core Data Best Practices

我會鼓勵你使用的核心數據編程指南頁的「反饋」按鈕,或文件雷達錯誤請求的文檔進行更新。

0

我一直在遵循的指南在這裏:http://www.cocoanetics.com/2012/07/multi-context-coredata/即使它是在2012年編寫的,它仍然與我目前看到的一致。它可以幫助您使用NSMainQueueConcurrencyType設置主父上下文,使用NSPrivateQueueConcurrencyType設置多個後臺上下文,並且還具有持久存儲的後臺編寫器上下文。

XCode 6和Yosemite在覈心數據調試方面似乎也有所改進:http://oleb.net/blog/2014/06/core-data-concurrency-debugging/。這對理解如何在正確的地方使用performBlock非常有用。