即使我使用nsoperations并将maxConcurrentOperationCount设置为3,我的mac os x app也没有响应

时间:2011-02-13 22:58:21

标签: cocoa macos nsoperation nsoperationqueue

我一直在关注堆栈溢出但很久没有机会提出我的第一个问题,所以这里是:

我正在开发一个mac os x应用程序并使用nsoperations来保持应用程序响应, 我还将maxConcurrentOperationCount设置为3,但应用程序在执行其工作时仍然有点无响应,如果它要移动窗口我可以看到它开始滞后并且行为不正常

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

3 个答案:

答案 0 :(得分:2)

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

  • 你是直接阻止主事件循环或用事件充满它

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

  • 您的应用使用了大量内存,导致系统无法进行分页。如果您有10个线程或1个线程并不重要,只要您开始分页,您的性能就会下降

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

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

答案 1 :(得分:1)

如果应用程序无响应,您将阻止代码中的某个主线程,使用活动监视器或工具(推荐)获取样本,以找出代码中的位置。

答案 2 :(得分:1)

仅使用NSOperations不会使应用响应。响应的关键是不阻止主线程。如果你的应用程序是滞后的,那就是(通常是看@bbum的答案),因为你正在做一些阻碍主线程的事情。

找出使用仪器的方法。使用Time Profiler工具,然后查看主线程上正在运行的内容。使这些东西变小,将它们移动到操作中,延迟执行它们,或者它们的某种组合。如果你需要重构,那就去做吧。

一种可能性是您在the main queue上运行操作。不要这样做 - 它们将在主线程上连续运行(不管maxOperationCount)。创建一个队列并使用您创建的队列。