我有一个使用多个 ManagedObjectContext 的应用程序。
我正在使用 Objective-C。
使用 NSPrivateQueueConcurrencyType 创建一个 MOC。其余的都是使用 NSMainQueueConcurrencyType 创建的。
每当我使用 MOC 时,我都会使用 [performBlockAndWait:]。
当我在禁用断点的情况下运行应用程序时,应用程序将挂起。堆栈跟踪显示有 2 个线程尝试运行 PerformBlockAndWait。
如果我在启用断点的情况下运行应用程序,并且有多个断点会中断我的代码,则应用程序不会挂起。
我在网上搜索过,虽然我看到了一些有关挂起的条目,但没有任何帮助,也没有找到任何符合我的情况的内容。
在performBlockAndWait如何工作以及何时适合或不适合使用方面,我显然遗漏了一些东西(或很多东西)。
非常需要一些帮助/提示。这真是令人沮丧。
Xcode 版本为 15.3,iOS/iPadOS 的部署目标为 16.4。
performBlockAndWait
很容易造成死锁。许多死锁都是对时间敏感的,因此如果添加断点,就可以完全改变时间并创建或避免在其他情况下可能发生的死锁。即便如此,竞争条件仍然存在并且必须得到解决。您的堆栈跟踪将准确地显示这是如何发生的,所以从这里开始。
performBlockAndWait
中的任何内容都必须非常简单,并且其本身不依赖于任何其他可能重新进入的阻塞操作,这一点至关重要。如果您的 peformBlockAndWait
调用任何重要方法,您需要探索该方法是否也会阻塞。理想情况下,您应该完全避免 performBlockAndWait
并使用更简单的 perform
来代替。