我发现至少为 Mac 编写一些具有或多或少常见 UI 的东西是很困难的。我的应用程序必须有托盘图标并且能够显示系统通知
问题是 goroutine 本身。在 Mac 上对 UI 框架的任何调用都要求从主线程调用,或者至少以线程安全的方式调用。
当我已经在运行 UI(嗯,对于 GUI 应用程序是必须的,不是吗?)并尝试显示通知时,就会出现问题。这样做的原因似乎是系统托盘包 Init 函数必须被锁定到主线程使用runtime.LockOsThread并且永远不会释放它。然后,如果我尝试显示也需要runtime.LockOsThread它的通知,则会导致以下错误:
2016-01-11 22:56:27.973 main[30162:4094392] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /Library/Caches/com.apple.xbs/Sources/Foundation/Foundation-1256.1/Misc.subproj/NSUndoManager.m:359
2016-01-11 22:56:27.974 main[30162:4094392] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
2016-01-11 22:56:27.977 main[30162:4094392] (
0 CoreFoundation 0x00007fff8d42bae2 __exceptionPreprocess + 178
1 libobjc.A.dylib 0x00007fff8bb03f7e objc_exception_throw + 48
2 CoreFoundation 0x00007fff8d42b8ba +[NSException raise:format:arguments:] + 106
3 Foundation 0x00007fff8cb4c88c -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
4 Foundation 0x00007fff8cad24c1 +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 170
5 AppKit 0x00007fff8514206a -[NSApplication run] + 844
6 main 0x0000000004166200 nativeLoop + 128
7 main 0x0000000004165bca _cgo_8c6479959095_Cfunc_nativeLoop + 26
8 main 0x000000000405a590 runtime.asmcgocall + 112
)
有解决方法吗?到目前为止我能想到的就是将 UI 和通知放入单独的二进制文件中,并使它们通过某种 IPC 与 main 进行通信。但我可能会遗漏一些东西。
幕布斯6054654
慕田峪7331174
相关分类