我一直在研究堆栈溢出,但从来没有真正有机会提出我的第一个问题,所以这里是:
我正在开发一个 mac os x 应用程序并使用 nsoperations 来保持应用程序响应,我还将 maxConcurrentOperationCount 设置为 3,但是该应用程序在工作时仍然有些无响应,如果它试图移动窗口我可以看到它开始滞后和行为不规律
有人可以提供任何线索或解决方案的指针吗?(不,不询问示例代码;)
我一直在研究堆栈溢出,但从来没有真正有机会提出我的第一个问题,所以这里是:
我正在开发一个 mac os x 应用程序并使用 nsoperations 来保持应用程序响应,我还将 maxConcurrentOperationCount 设置为 3,但是该应用程序在工作时仍然有些无响应,如果它试图移动窗口我可以看到它开始滞后和行为不规律
有人可以提供任何线索或解决方案的指针吗?(不,不询问示例代码;)
在这种情况下,应用程序可能无响应的原因有很多:
你直接阻塞了主事件循环或用事件淹没它
你在主线程上有复杂的绘图操作
您的应用程序使用的内存过多,导致系统分页。如果您有 10 个线程或 1 个线程并不重要,只要您开始分页,您的性能就会下降
您在主线程和后台线程/队列之间存在锁争用
Instruments 提供了一系列用于分析 CPU 使用情况的工具。我要做的第一件事是弄清楚主线程是否正在使用大量 CPU(如果是这样,是为了什么?)或者它是否被阻塞等待锁等。
如果应用程序变得无响应,您在代码中的某处阻塞了主线程,请使用活动监视器或工具(推荐)进行抽样以找出代码中的位置。
仅使用 NSOperations 不会使应用程序响应。响应能力的关键是不阻塞主线程。如果您的应用程序滞后,那是(通常——参见@bbum 的回答)因为您正在做某事或某事阻塞了主线程。
找出什么是使用 Instruments 的方法。使用 Time Profiler 工具,然后查看主线程上运行的内容。让这些事情变得更小,将它们转移到操作中,延迟执行它们,或者它们的某种组合。如果你需要重构,那就去做吧。
一种可能性是您正在主队列上运行您的操作。不要那样做——它们会maxOperationCount
在主线程上连续(不管 )运行。创建一个队列并使用您创建的队列。