gpt4 book ai didi

ios - NSManagedObjectContext performBlockAndWait : and dispatch_semaphore causing a deadlock

转载 作者:行者123 更新时间:2023-12-01 15:51:40 26 4
gpt4 key购买 nike

我有一个下载一些数据的 NSURLSession(带有委托(delegate))。我不希望启动下载 (refresh) 的方法在执行委托(delegate)方法之前返回。为此,我在 refresh 的末尾设置了一个 dispatch_semaphore_wait(self.waitSemaphore, timeout)waitSemaphore 在适当的 NSURLSessionDownloadDelegate 方法结束时收到信号。

在该委托(delegate)方法中,我正在调用另一个方法,该方法在 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?),以便让主线程空闲以执行特定的获取操作。

关于ios - NSManagedObjectContext performBlockAndWait : and dispatch_semaphore causing a deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21557936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com