主线程Runloop在打开nsmenu时被阻止

时间:2012-06-04 12:16:05

标签: cocoa nsnotificationcenter nsmenu nsrunloop nsstatusitem

我有一个UI元素包含NSStatusItem和菜单的应用程序。在我的应用程序中,我使用NSTask异步执行某些操作,我使用NSFileHandleReadCompletionNotification获取的输出来更新菜单。但是现在每当我点击并打开菜单时,主runloop进入NSEventTrackingRunLoopMode并且通知发布失败。所以基本上打开我的菜单,主线程上不会进行任何操作。现在我在this帖子上发现了类似的问题,但是那里接受的解决方案似乎没有帮助。我了解,对于NSNotificationCenter,不得阻止NSRunloopDefaultMode。反正有改变这个bahaviour ???谁能请帮忙???

1 个答案:

答案 0 :(得分:2)

我猜测你有NSFileHandle代表NSTask的{​​{1}},你已经问过它-readInBackgroundAndNotify

正如您所发现的,这个问题是,这只会在runloop处于默认模式时通知。如果runloop进入另一种模式(例如菜单打开时),那么您的通知将在主runloop上排队,并等待runloop重新进入默认模式。

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

相关问题