3

我有一个 UI 元素包含一个NSStatusItem和一个菜单的应用程序。在我的应用程序中,我使用NSTask异步执行一些操作,并使用使用 获得的输出 NSFileHandleReadCompletionNotification来更新菜单。但是现在每当我单击并打开菜单时,主运行循环都会进入 NSEventTrackingRunLoopMode并且通知发布失败。所以基本上在我的菜单打开的情况下,主线程上不会发生任何操作。现在我在这篇文章中发现了一个类似的问题,但那里接受的解决方案似乎没有帮助。我知道对于NSNotificationCenterNSRunloopDefaultMode不能被阻止。有没有办法改变这种行为???有人可以帮忙吗???

4

1 回答 1

3

我猜是你有一个NSFileHandle代表NSTask's 的stdout,你已经要求它了-readInBackgroundAndNotify

正如您所发现的那样,问题在于它仅在运行循环处于默认模式时发出通知。如果 runloop 进入另一种模式(例如打开菜单时),那么您的通知将在主 runloop 上排队并等待直到 runloop 重新进入默认模式。

您想要使用的是-readInBackgroundAndNotifyForModes:方法,您将向该方法传递一个包含NSDefaultRunLoopMode和的数组NSEventTrackingRunLoopMode。这将向 runloop 表明,当 runloop 处于默认模式或事件跟踪模式时,您希望收到任何可用数据的通知。

于 2012-06-04T14:48:26.333 回答