我有一个 UI 元素包含一个NSStatusItem
和一个菜单的应用程序。在我的应用程序中,我使用NSTask
异步执行一些操作,并使用使用 获得的输出 NSFileHandleReadCompletionNotification
来更新菜单。但是现在每当我单击并打开菜单时,主运行循环都会进入 NSEventTrackingRunLoopMode
并且通知发布失败。所以基本上在我的菜单打开的情况下,主线程上不会发生任何操作。现在我在这篇文章中发现了一个类似的问题,但那里接受的解决方案似乎没有帮助。我知道对于NSNotificationCenter
,NSRunloopDefaultMode
不能被阻止。有没有办法改变这种行为???有人可以帮忙吗???
问问题
1232 次
1 回答
3
我猜是你有一个NSFileHandle
代表NSTask
's 的stdout
,你已经要求它了-readInBackgroundAndNotify
。
正如您所发现的那样,问题在于它仅在运行循环处于默认模式时发出通知。如果 runloop 进入另一种模式(例如打开菜单时),那么您的通知将在主 runloop 上排队并等待直到 runloop 重新进入默认模式。
您想要使用的是-readInBackgroundAndNotifyForModes:
方法,您将向该方法传递一个包含NSDefaultRunLoopMode
和的数组NSEventTrackingRunLoopMode
。这将向 runloop 表明,当 runloop 处于默认模式或事件跟踪模式时,您希望收到任何可用数据的通知。
于 2012-06-04T14:48:26.333 回答