主线程Runloop被封锁打开nsmenu(Main Thread Runloop gets blo

2019-06-25 08:23发布

我有哪个UI元素包括应用程序NSStatusItem和一个菜单。 在我的申请,我使用NSTask异步执行一些操作,我使用利用所获得的输出NSFileHandleReadCompletionNotification更新菜单。 但现在每当我点击并打开菜单,主runloop进入NSEventTrackingRunLoopMode和通知发布失败。 所以,我的菜单中打开基本上没有操作发生在主线程上进行。 现在,我发现了一个类似的问题, 这个职位,但接受的解决方案似乎有没有帮助。 我明白, NSNotificationCenterNSRunloopDefaultMode不得阻塞。 反正是有改变这种bahaviour ??? 任何人都可以请帮助???

Answer 1:

我猜是你有一个NSFileHandle表示NSTaskstdout ,和你问它-readInBackgroundAndNotify

这样做的问题,因为你发现,就是当runloop是在默认模式下这只通知。 如果runloop进入另一种模式(例如,当一个菜单打开),那么您的通知将排队,在主runloop和将等到runloop重新进入默认模式。

要改用什么是-readInBackgroundAndNotifyForModes:方法,对您会通过既包含数组NSDefaultRunLoopModeNSEventTrackingRunLoopMode 。 这将指示要通知任何可用的数据时,runloop或者是在默认模式或事件跟踪模式的runloop。



文章来源: Main Thread Runloop gets blocked on opening nsmenu