OS X何时决定为您的应用提供旋转沙滩球?编程应用程序时可以做些什么来避免这种情况?
答案 0 :(得分:20)
当最前面的应用程序或在鼠标指针下有窗口的应用程序在特定时间窗口内没有响应来自窗口服务器的事件时,窗口服务器将显示旋转等待光标。
为了避免旋转等待光标,应用程序需要及时为事件提供服务。没有办法绕过这个窗口服务器的行为,并且有充分的理由:Mac OS X上的应用程序永远不应该对用户没有响应。
答案 1 :(得分:7)
原因是您的应用阻止了用户界面。正如其他海报所说,窗口管理器可以注意到你有一段时间没有处理过事件并提出了这个UI。
您很可能在UI(默认)线程上同步执行某些IO(例如读取或写入磁盘或执行网络请求)。保持应用程序响应(从而避免沙滩球)的一个好的经验法则是永远不要在UI线程上执行同步IO。您可以使用异步IO(接受回调的API,在后台线程上工作,然后在UI线程完成时通知您),否则您可以使用单独的后台线程来完成工作。
如果你没有做IO,那么你可能在UI线程上有某种长循环,导致你没有响应。在这种情况下,优化或删除循环,或将其移动到后台线程。
答案 2 :(得分:6)
假设您的应用程序具有足够的硬件资源(实际情况并非总是如此),那么您的应用程序应该没有理由进行竞争。如果是这样,找出阻止用户界面的代码部分(如果它是非直观的Shark.app会派上用场)并将其移动到后台线程(或使用其他策略来消除暂停)。幸运的是Cocoa和Objective-C有很好的线程工具,请参阅NSOperationQueue。 Apple也有一些关于性能调优的好文档,请参阅this question以获取相关链接。