2012-07-11 47 views
2

我不知道NSPrivateQueueConcurrencyType上下文是否僅在-performBlock和-performBlockAndWait內運行。 和NSManagedObject從NSPrivateQueueConcurrencyType上下文無法在performBlock之外訪問嗎?NSPrivateQueueConcurrencyType上下文只能在performBlock內運行?

我發現下面的句子,從蘋果的文檔「什麼在安裝iOS 5.0新」

當將消息發送到一個隊列關聯創建一個背景下,必須使用performBlock:如果你的代碼的方法:或者performBlockAndWait尚未在該隊列(對於主隊列類型)或在performBlock ...調用(對於專用隊列類型)的範圍內執行。在傳遞給這些方法的塊中,可以自由使用NSManagedObjectContext的方法。

如果是這樣,爲什麼MagicalRecord和XMPPFramework不能在塊內操作上下文和NSManagedObject?

+0

[XMPP](https://github.com/robbiehanson/XMPPFramework/issues/76#issuecomment-7435245)已解決此問題。 – simpzan 2012-08-02 00:04:20

回答

4

我不知道MagicalRecord和XMPPFramework中的代碼做了什麼或不做什麼。您需要通過正常的支持方式與他們聯繫。

但是,我可以告訴您,如果您使用NSPrivateQueueConcurrencyType創建MOC,那麼您應該訪問該MOC擁有的MOC或託管對象的唯一方法是通過performBlock * API。

如果使用NSMainQueueConcurrencyType創建MOC,則可以在主線程中運行或通過performBlock * API訪問它。

如果使用NSConfinementConcurrencyType創建MOC,則只能從創建MOC的線程訪問MOC。如果未指定併發性,則將Confinement用作默認值。

這些是目前創建MOC的唯一方法,以及它們使用規則的摘要。我相信MagicalRecord使用限制,並保持每個線程的MOC,但我從來沒有使用它,並且只查看代碼庫的舊版本,所以它可能隨着嵌套上下文的出現而發生很大變化。

相關問題