2013-05-04 96 views
4

我有一個OSX應用程序,我正在使用父/子NSManagedObjectContext設置。孩子MOC有NSPrivateQueueConcurrencyType,是我主要使用的。父級設置爲NSMainQueueConcurrencyTypeNSManagedObjectContext performBlockAndWait當從兩個線程調用時導致死鎖

當我從後臺線程調用performBlockAndWait在從主線程調用它的同時,我得到死鎖 - semaphore_wait_trap。暫停調試器顯示兩個線程都卡在performBlockAndWait

我該如何解決這個問題?我認爲這種方法是專門針對這種情況設計的,只需將上下文的私有隊列中的塊排隊,然後適當地返回?

回答

2

我通過創建一個串行隊列,然後執行所有performBlock調用來確保它們不會互相混淆。老實說,我不確定這是否是好的做法,但它確實解決了我的特殊情況。

1

即使使用專用併發類型,NSManagedObjectContext仍然不是線程安全的。

performBlock:and performBlockAndWait:只確保塊操作在爲上下文指定的隊列上執行。

您仍然可以使用performBlockAndWait:獲取死鎖,因爲它會阻止當前正在執行的線程,直到它返回。 performBlockAndWait內發生了什麼:?可能是需要訪問主線程的東西,這就是爲什麼它是死鎖的。

你可以使用performBlock:取而代之嗎?

+0

嗯我可以嘗試和切換我的代碼執行塊是的,肯定會更長的回調等,但完全有可能我敢肯定。那麼通過使用這種方法,塊將以線程安全的方式執行? – 2013-05-04 23:17:44

+0

performBlock和performBlockAndWait只是確保您傳遞給它們的塊在與託管對象上下文相關的正確隊列上執行。所以是的,你的塊將在上下文中以線程安全的方式執行 - 不同之處在於你的代碼的語義,如果你需要阻塞並等待塊完成。我會一直努力首先使用performBlock並使用performBlockAndWait,如果不得不出於任何原因。請參閱http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/index.html – bandejapaisa 2013-05-05 06:41:00