0

我一直在研究堆栈溢出,但从来没有真正有机会提出我的第一个问题,所以这里是:

我正在开发一个 mac os x 应用程序并使用 nsoperations 来保持应用程序响应,我还将 maxConcurrentOperationCount 设置为 3,但是该应用程序在工作时仍然有些无响应,如果它试图移动窗口我可以看到它开始滞后和行为不规律

有人可以提供任何线索或解决方案的指针吗?(不,不询问示例代码;)

4

3 回答 3

2

在这种情况下,应用程序可能无响应的原因有很多:

  • 你直接阻塞了主事件循环或用事件淹没它

  • 你在主线程上有复杂的绘图操作

  • 您的应用程序使用的内存过多,导致系统分页。如果您有 10 个线程或 1 个线程并不重要,只要您开始分页,您的性能就会下降

  • 您在主线程和后台线程/队列之间存在锁争用

Instruments 提供了一系列用于分析 CPU 使用情况的工具。我要做的第一件事是弄清楚主线程是否正在使用大量 CPU(如果是这样,是为了什么?)或者它是否被阻塞等待锁等。

于 2011-02-13T23:07:16.443 回答
1

如果应用程序变得无响应,您在代码中的某处阻塞了主线程,请使用活动监视器或工具(推荐)进行抽样以找出代码中的位置。

于 2011-02-13T23:03:59.903 回答
1

仅使用 NSOperations 不会使应用程序响应。响应能力的关键是不阻塞主线程。如果您的应用程序滞后,那是(通常——参见@bbum 的回答)因为您正在做某事或某事阻塞了主线程。

找出什么是使用 Instruments 的方法。使用 Time Profiler 工具,然后查看主线程上运行的内容。让这些事情变得更小,将它们转移到操作中,延迟执行它们,或者它们的某种组合。如果你需要重构,那就去做吧。

一种可能性是您正在主队列上运行您的操作。不要那样做——它们会maxOperationCount在主线程上连续(不管 )运行。创建一个队列并使用您创建的队列。

于 2011-02-13T23:08:27.177 回答