我有一个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?),以使主线程对于特定的提取操作保持空闲状态。