我有一个UI元素包含NSStatusItem
和菜单的应用程序。在我的应用程序中,我使用NSTask
异步执行某些操作,我使用NSFileHandleReadCompletionNotification
获取的输出来更新菜单。但是现在每当我点击并打开菜单时,主runloop进入NSEventTrackingRunLoopMode
并且通知发布失败。所以基本上打开我的菜单,主线程上不会进行任何操作。现在我在this帖子上发现了类似的问题,但是那里接受的解决方案似乎没有帮助。我了解,对于NSNotificationCenter
,不得阻止NSRunloopDefaultMode
。反正有改变这个bahaviour ???谁能请帮忙???
答案 0 :(得分:2)
我猜测你有NSFileHandle
代表NSTask
的{{1}},你已经问过它-readInBackgroundAndNotify
。
正如您所发现的,这个问题是,这只会在runloop处于默认模式时通知。如果runloop进入另一种模式(例如菜单打开时),那么您的通知将在主runloop上排队,并等待runloop重新进入默认模式。
您要使用的是-readInBackgroundAndNotifyForModes:
方法,您可以将包含stdout
和NSDefaultRunLoopMode
的数组传递给该方法。这将向runloop指示当runloop处于默认模式或事件跟踪模式时,您希望收到任何可用数据的通知。