我有一个OSX应用程序,我正在使用父/子NSManagedObjectContext设置。孩子MOC有NSPrivateQueueConcurrencyType
,是我主要使用的那个。父级设置为NSMainQueueConcurrencyType
当我从后台线程调用子上下文的performBlockAndWait
同时从主线程调用它时,我得到死锁 - semaphore_wait_trap
。暂停调试器会显示两个线程都停留在performBlockAndWait
我该如何解决这个问题?我认为这个方法是针对这种情况设计的,只是将上下文的私有队列中的块排队然后适当地返回?
答案 0 :(得分:2)
我通过创建一个串行队列来解决这个问题,然后通过这个来完成所有的performBlock调用,以确保它们不会互相混乱。老实说,我不确定这是不是很好的做法,但它确实解决了我的特殊情况。
答案 1 :(得分:1)
NSManagedObjectContext仍然不是线程安全的,即使使用私有并发类型。
performBlock:和performBlockAndWait:仅确保在为上下文指定的队列上执行块操作。
你仍然可以通过performBlockAndWait:获得死锁,因为它会阻止当前正在执行的线程,直到它返回。 performBlockAndWait中发生了什么:?可能需要访问主线程的东西,这就是它死锁的原因。
你能使用performBlock吗?