2012-02-21 45 views
2

我在使用NSPrivateQueueConcurrencyTypeNSManagedObjectContext,並在以下情況發生死鎖。在兩個線程上使用NSPrivateQueueConcurrencyType管理對象上下文時發生死鎖

在後臺線程上調用performBlock:。該塊包含executeFetchRequest:error:呼叫。

當該塊正在執行時,主線程調用performBlockAndWait:。主線程在後臺線程完成時等待。這很正常。

當在背景的線程塊上調用executeFetchRequest:error:時,會發生死鎖。

我想象一下executeFetchRequest:error:正在等待performBlockAndWait:的主線程完成。

這是一個錯誤嗎?或者我不明白什麼?對我而言,所有這些代碼對於NSPrivateQueueConcurrencyType MOC似乎都是有效的。

+0

這不會發生很多,但是當它發生時,那麼......應用程序已經死亡。 – gcamp 2012-02-21 03:41:02

回答

2

NSPrivateQueueConcurrencyType不會自動使NSManagedObjectContext線程安全。如果您需要在多個線程上使用Core Data,則仍應爲每個線程使用不同的上下文。

+0

然後私人隊列的意義何在?從文檔中:「不是創建和管理與上下文關聯的線程或隊列,而是上下文擁有隊列併爲您管理所有細節(假定您使用如下所述的基於塊的方法)。 「在我看來,我應該使用基於塊的方法並只使用一個上下文。 – gcamp 2012-02-21 14:14:16

+0

我已經理解NSPrivateQueueConcurrencyType的方式是它可以讓你在私有線程上執行操作塊,但是你仍然需要手動避免由於從多個線程訪問而引起競爭條件。再次閱讀文檔後,我不是100%肯定的... – Aderstedt 2012-02-22 16:27:17

+0

我們確保在主線程上執行BlockAndWait時使用NSMainQueueConcurrencyType。現在工作。 – gcamp 2012-02-25 20:59:51

相關問題