我有一个UI元素包括NSStatusItem和菜单的应用程序。在我的应用程序内部,我异步使用NSTask执行某些操作,并且使用通过NSFileHandleReadCompletionNotification获得的输出来更新菜单。但是现在,每当我单击并打开菜单时,主运行循环就会进入NSEventTrackingRunLoopMode并且通知发布失败。所以基本上在我的菜单打开的情况下,主线程上没有任何操作。现在,我在this帖子上发现了类似的问题,但是那里公认的解决方案似乎无济于事。我了解对于NSNotificationCenter,必须禁止NSRunloopDefaultMode。无论如何,有没有改变这种行为???谁能帮忙???

最佳答案

我猜是您有一个表示NSFileHandleNSTaskstdout,并且您已要求它-readInBackgroundAndNotify

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

相反,您要使用的是-readInBackgroundAndNotifyForModes:方法,您将向其中传递包含NSDefaultRunLoopModeNSEventTrackingRunLoopMode的数组。这将向runloop指示,当runloop处于默认模式或事件跟踪模式时,您希望收到任何可用数据的通知。

10-08 08:06