4

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

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

我怎样才能解决这个问题?我认为这种方法正是为这种情况而设计的,并且只需将上下文的私有队列中的块排队,然后适当地返回?

4

2 回答 2

2

我通过创建一个串行队列来解决这个问题,然后通过它执行我所有的 performBlock 调用,以确保它们不会相互混淆。老实说,我不确定这是否是一种好习惯,但它确实解决了我特定情况的问题。

于 2013-07-24T04:25:02.183 回答
1

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

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

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

你可以使用 performBlock: 代替吗?

于 2013-05-04T20:40:39.650 回答