我有哪个UI元素包括应用程序NSStatusItem
和一个菜单。 在我的申请,我使用NSTask
异步执行一些操作,我使用利用所获得的输出NSFileHandleReadCompletionNotification
更新菜单。 但现在每当我点击并打开菜单,主runloop进入NSEventTrackingRunLoopMode
和通知发布失败。 所以,我的菜单中打开基本上没有操作发生在主线程上进行。 现在,我发现了一个类似的问题, 这个职位,但接受的解决方案似乎有没有帮助。 我明白, NSNotificationCenter
的NSRunloopDefaultMode
不得阻塞。 反正是有改变这种bahaviour ??? 任何人都可以请帮助???
Answer 1:
我猜是你有一个NSFileHandle
表示NSTask
的stdout
,和你问它-readInBackgroundAndNotify
。
这样做的问题,因为你发现,就是当runloop是在默认模式下这只通知。 如果runloop进入另一种模式(例如,当一个菜单打开),那么您的通知将排队,在主runloop和将等到runloop重新进入默认模式。
要改用什么是-readInBackgroundAndNotifyForModes:
方法,对您会通过既包含数组NSDefaultRunLoopMode
和NSEventTrackingRunLoopMode
。 这将指示要通知任何可用的数据时,runloop或者是在默认模式或事件跟踪模式的runloop。
文章来源: Main Thread Runloop gets blocked on opening nsmenu