我有一个UI元素包括NSStatusItem
和菜单的应用程序。在我的应用程序内部,我异步使用NSTask
执行某些操作,并且使用通过NSFileHandleReadCompletionNotification
获得的输出来更新菜单。但是现在,每当我单击并打开菜单时,主运行循环就会进入NSEventTrackingRunLoopMode
并且通知发布失败。所以基本上在我的菜单打开的情况下,主线程上没有任何操作。现在,我在this帖子上发现了类似的问题,但是那里公认的解决方案似乎无济于事。我了解对于NSNotificationCenter
,必须禁止NSRunloopDefaultMode
。无论如何,有没有改变这种行为???谁能帮忙???
最佳答案
我猜是您有一个表示NSFileHandle
的NSTask
的stdout
,并且您已要求它-readInBackgroundAndNotify
。
正如您所发现的,此问题在于,它仅在runloop处于默认模式时才通知。如果运行循环进入另一种模式(例如,打开菜单时),则您的通知将在主运行循环上排队,并等待直到运行循环重新进入默认模式。
相反,您要使用的是-readInBackgroundAndNotifyForModes:
方法,您将向其中传递包含NSDefaultRunLoopMode
和NSEventTrackingRunLoopMode
的数组。这将向runloop指示,当runloop处于默认模式或事件跟踪模式时,您希望收到任何可用数据的通知。