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

2023-12-07

我有一个应用程序,其 UI 元素包括NSStatusItem和菜单。在我的应用程序中,我正在使用NSTask异步执行一些操作,我正在使用使用获得的输出NSFileHandleReadCompletionNotification更新菜单。但现在每当我单击并打开菜单时,主运行循环就会进入NSEventTrackingRunLoopMode并且通知发布失败。所以基本上在我的菜单打开的情况下,主线程上不会发生任何操作。现在我发现了类似的问题this发布但那里接受的解决方案似乎没有帮助。我的理解是为了NSNotificationCenter , the NSRunloopDefaultMode不得被阻止。有什么办法可以改变这种行为吗???有人可以帮忙吗???


我猜你有一个NSFileHandle代表的是NSTask's stdout,并且您已经要求它-readInBackgroundAndNotify.

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

你想用的是-readInBackgroundAndNotifyForModes:方法,您将向其传递一个包含两者的数组NSDefaultRunLoopMode and NSEventTrackingRunLoopMode。这将向运行循环表明,当运行循环处于默认模式或事件跟踪模式时,您希望收到任何可用数据的通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主线程 Runloop 在打开 nsmenu 时被阻止 的相关文章

随机推荐