2013-05-20 45 views
6

NSManagedObjectContext已經添加了performBlock:和performBlockAndWait:方法來幫助簡化併發。我一直在使用它們 - 可能相當天真 - 我只是意識到有一個我從未真正問過的問題。你可以在其上下文的performBlock之外使用NSManagedObject嗎?

如果我在其中一個performBlock方法中創建了一個NSManagedObject子類,它是'home'線程是它的父上下文的線程 - 在NSPrivateQueueConcurrencyType的情況下可能是一個獨立線程,我沒有其他訪問權限。

那麼,我需要做一個performBlock調用來訪問我的託管對象中包含的數據嗎?或者在使用吸氣劑的情況下是否有背景魔法幫助保護我? (或者制定者,儘管這似乎是一個糟糕的主意......)

回答

13

NSManagedObject是不應該的managedObjectContext螺紋/隊列(有時它的工作原理外使用,有些時候,你崩潰==>不做它)。

CoreData不保證對對象的安全讀訪問。

訪問由「專用隊列」上下文擁有的對象,總是請使用[context performBlock:...][context performBlockAndWait:...],除非你訪問它的objectIDmanagedObjectContext性能。

+0

非常感謝,我在想什麼是必要的......我希望我錯了。我需要重新觀看他們介紹該技術的WWDC視頻,因爲我不記得他們必須這樣做......然後,我懷疑有很多WWDC視頻需要重新觀看。 – RonLugge

+1

我想補充一點,蘋果工程師明確指出,對'NSManagedObject'的讀取不是線程安全的,因爲核心數據沒有緩存,而且緩存寫入也不是線程安全的 –

9

您確實需要使用performBlock:performBlockAndWait:,但有一個例外。如果您使用的是NSMainQueueConcurrencyType您正在使用主隊列上的管理對象,則可以直接訪問它,而無需阻止。當您需要從託管對象更新UI時,這可能非常方便,反之亦然。

+1

另一個例外是'NSConfinementConcurrencyType',它與主隊列類似,僅適用於特定的線程(「舊」版本的託管上下文) –

+0

我想我應該更好地回答我的問題,因爲它基本上只適用於NSPrivateQueue和NSMainQueue類型...即便如此,主要是私有隊列版本感謝這個奇妙的例外。 – RonLugge

相關問題