我有一个NSURLSession(带有委托),可以下载一些数据。我不希望启动下载的方法(refresh
)返回,直到委托方法被执行。为此,我在dispatch_semaphore_wait(self.waitSemaphore, timeout)
的末尾有一个refresh
。 waitSemaphore
在相应的NSURLSessionDownloadDelegate方法结束时发出信号。
在该委托方法中,我正在调用另一个在NSManagedObjectContext上调用performBlockAndWait
(很多次)的方法。 MOC是使用NSPrivateQueueConcurrencyType
设置的。在第一次调用performBlockAndWait
时,应用程序死锁。在performBlockAndWait
我正在执行获取请求,没有其他performBlockAndWaits
。
NSURLSessionDownloadDelegate方法在他们自己的NSOperationQueue上执行。我不创建这个队列,它是由NSURLSession创建的。当我从主线程中调用refresh
时,我只遇到上述死锁。如果我从另一个队列调用它,它按预期工作。
非常感谢任何帮助。
提前致谢。
答案 0 :(得分:0)
我发现无论你创建核心数据堆栈(NSPersistentStoreCoordinator和NSManagedObjectModel等)的哪个线程都需要解锁,以便持久保存或获取数据,因为在保存或从持久存储中检索的某些时候,那些操作在该线程上执行。
为了避免这个问题,我在一个单独的线程上创建了第二个核心数据堆栈(即Can multiple NSPersistentStoreCoordinator instances be connected to the same underlying SQLite persistent store?),以便保持主线程可用于特定的获取操作。