man xpc_abort
によると、_xpc_api_misuse
でクラッシュしたらlldbで expression -l c -- (char*)xpc_debugger_api_misuse_info()
してクラッシュした理由を調べられるらしい。 (edited)(lldb) expression -l c -- (char*)xpc_debugger_api_misuse_info() (char *) $9 = 0x00007000029e6f90 "XPC API Misuse: Over-resume of a connection."
(edited)synchronousRemoteObjectProxyWithErrorHandler(_:)
なんてのがあるくらいだから、シリアルキューにしたのは正しい様に見える。API Misuse: Over-resume of a connection
だからシリアルキューに積むのは合ってる(と思う)、んですけどシリアルキューに入れた処理は非同期だからすぐ抜けてしまうので、connection が先の処理をしている間にまた別のresumeが呼ばれてしまう状況は直ってないんじゃないかな、と思ったんですよね。 順次処理にするのは正しいけど、現状は順次処理に結局なっていないのでは?という疑問です。 (edited)resume
は初期化時に一回だけやって、suspend
は必要なし。ってかんじじゃないです?resume()
しないなら、interruptionHandler
をちゃんと設定しないとまずそう。interruptionHandler
での処理が面倒で、毎回resume()
, suspend()
を呼ぶ様にしたことがあった様な…NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged, handler: { _ in })
を使おうとしたところメニューバーが開けなくなってしまい困っています。何か解決方法に心当たりのあり方いらっしゃいましたらご教授いただきたいです。(MenuBarExtraの部分は https://sarunw.com/posts/swiftui-menu-bar-app/ を参考にしています) App.swift import SwiftUI @main struct test_MenuBarExtraApp: App { @State var currentNumber: String = "1" init() { NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged, handler: { _ in }) } var body: some Scene { MenuBarExtra(currentNumber, systemImage: "\(currentNumber).circle") { Button("One") { currentNumber = "1" } Button("Two") { currentNumber = "2" } Button("Three") { currentNumber = "3" } Divider() Button("Quit") { NSApplication.shared.terminate(nil) } } } }
(edited) init() { DispatchQueue.main.async { NSEvent.addGlobalMonitorForEvents(matching: [.flagsChanged]) { event in } } }