我有一个NSURLSession(与委托),可以下载一些数据。我不希望在执行委托方法之前返回用于启动下载的方法(refresh)。为此,我在dispatch_semaphore_wait(self.waitSemaphore, timeout)的末尾有一个refresh。在适当的NSURLSessionDownloadDelegate方法的末尾发出waitSemaphore信号。

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

NSURLSessionDownloadDelegate方法在其自己的NSOperationQueue上执行。我没有创建此队列,而是由NSURLSession创建的。从主线程调用refresh时,只会遇到上述死锁。如果我从另一个队列中调用它,它将按预期工作。

任何帮助,将不胜感激。

提前致谢。

最佳答案

我发现,无论在哪个线程上创建核心数据堆栈(NSPersistentStoreCoordinator和NSManagedObjectModel等),都需要解锁才能持久化或提取数据,因为在保存或从持久性存储中检索时,这些操作都将执行在那个线程上。

为了回避这个问题,我在单独的线程上创建了第二个核心数据堆栈(即Can multiple NSPersistentStoreCoordinator instances be connected to the same underlying SQLite persistent store?),以使主线程对于特定的提取操作保持空闲状态。

10-08 05:34