NSManagedObjectContext performBlockAndWait从两个线程调用时导致死锁

时间:2013-05-04 16:34:47

标签: objective-c xcode macos core-data

我有一个OSX应用程序,我正在使用父/子NSManagedObjectContext设置。孩子MOC有NSPrivateQueueConcurrencyType,是我主要使用的那个。父级设置为NSMainQueueConcurrencyType

当我从后台线程调用子上下文的performBlockAndWait同时从主线程调用它时,我得到死锁 - semaphore_wait_trap。暂停调试器会显示两个线程都停留在performBlockAndWait

我该如何解决这个问题?我认为这个方法是针对这种情况设计的,只是将上下文的私有队列中的块排队然后适当地返回?

2 个答案:

答案 0 :(得分:2)

我通过创建一个串行队列来解决这个问题,然后通过这个来完成所有的performBlock调用,以确保它们不会互相混乱。老实说,我不确定这是不是很好的做法,但它确实解决了我的特殊情况。

答案 1 :(得分:1)

NSManagedObjectContext仍然不是线程安全的,即使使用私有并发类型。

performBlock:和performBlockAndWait:仅确保在为上下文指定的队列上执行块操作。

你仍然可以通过performBlockAndWait:获得死锁,因为它会阻止当前正在执行的线程,直到它返回。 performBlockAndWait中发生了什么:?可能需要访问主线程的东西,这就是它死锁的原因。

你能使用performBlock吗?