NSManagedObjectContext performBlockAndWait:和dispatch_semaphore导致死锁

时间:2014-02-04 16:28:33

标签: ios objective-c grand-central-dispatch deadlock nsmanagedobjectcontext

我有一个NSURLSession(带有委托),可以下载一些数据。我不希望启动下载的方法(refresh)返回,直到委托方法被执行。为此,我在dispatch_semaphore_wait(self.waitSemaphore, timeout)的末尾有一个refreshwaitSemaphore在相应的NSURLSessionDownloadDelegate方法结束时发出信号。

在该委托方法中,我正在调用另一个在NSManagedObjectContext上调用performBlockAndWait(很多次)的方法。 MOC是使用NSPrivateQueueConcurrencyType设置的。在第一次调用performBlockAndWait时,应用程序死锁。在performBlockAndWait我正在执行获取请求,没有其他performBlockAndWaits

NSURLSessionDownloadDelegate方法在他们自己的NSOperationQueue上执行。我不创建这个队列,它是由NSURLSession创建的。当我从主线程中调用refresh时,我只遇到上述死锁。如果我从另一个队列调用它,它按预期工作。

非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我发现无论你创建核心数据堆栈(NSPersistentStoreCoordinator和NSManagedObjectModel等)的哪个线程都需要解锁,以便持久保存或获取数据,因为在保存或从持久存储中检索的某些时候,那些操作在该线程上执行。

为了避免这个问题,我在一个单独的线程上创建了第二个核心数据堆栈(即Can multiple NSPersistentStoreCoordinator instances be connected to the same underlying SQLite persistent store?),以便保持主线程可用于特定的获取操作。