11

OS X 什么时候决定给你的应用一个旋转的沙滩球?在编写应用程序时可以做些什么来避免这种情况?

4

3 回答 3

20

当最前面的应用程序或鼠标指针下有一个窗口的应用程序在某个时间窗口内没有响应来自窗口服务器的事件时,窗口服务器将显示旋转等待光标。

为了避免旋转等待光标,应用程序需要及时处理事件。没有办法绕过这种窗口服务器行为,并且有充分的理由:Mac OS X 上的应用程序不应该对用户无响应。

于 2009-01-18T05:38:46.680 回答
7

原因是您的应用程序阻止了 UI。正如其他海报所说,窗口管理器可以注意到您有一段时间没有处理事件并放置此 UI。

您很可能正在 UI(默认)线程上同步执行一些 IO(例如读取或写入磁盘,或执行网络请求)。保持应用程序响应(从而避免沙滩球)的一个好的经验法则是永远不要在 UI 线程上执行同步 IO。您可以使用异步 IO(接受回调的 API,在后台线程上工作,然后在完成后在 UI 线程上通知您),或者您可以使用单独的后台线程来完成工作。

如果您不进行 IO,那么您可能处于 UI 线程上的某种长循环中,导致您无响应。在这种情况下,要么优化或删除循环,要么将其移至后台线程。

于 2009-01-18T06:54:24.173 回答
6

假设您的应用程序有足够的硬件资源(实际上并不总是如此),那么您的应用程序真的没有理由去抢滩。如果确实如此,请找出阻塞用户界面的代码部分(如果它不直观,Shark.app 会派上用场)并将其移至后台线程(或使用其他策略来消除暂停)。幸运的是 Cocoa 和 Objective-C 有很好的线程工具,请参阅 NSOperationQueue 开始。Apple 也有一些关于性能调整的好文档,请参阅此问题以获取相关链接。

于 2009-01-18T06:04:20.780 回答