提问人:Nelson Yeung 提问时间:11/15/2023 更新时间:11/15/2023 访问量:29
自定义异步 NSApplication 事件循环导致随机崩溃
Custom async NSApplication event loop causes random crashes
问:
以下代码启动一个空白的 GUI 应用程序,但在单击关闭和单击窗口时,它会随机崩溃。通过 Xcode 运行它有时会在崩溃时显示,但并非总是如此。No error handler for XPC error: <private>
我通过使用使事件循环异步。如果删除 await,应用程序将不会崩溃。await Task.yield()
将循环转换为异步的原因是我想在 CLI 工具的异步函数中启动一个 GUI。我可以通过编译一个单独的可执行文件来轻松解决这个问题,该可执行文件在单独的进程中启动 GUI,这样我就不需要异步了,但我想简化构建,只想知道为什么会发生这种情况。
创建一个并使用以下命令运行:foo.swift
./foo.swift
#!/usr/bin/env swift
import AppKit
import Foundation
class AppDelegate: NSObject, NSApplicationDelegate {}
let app = NSApplication.shared
let appDelegate = AppDelegate()
NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 640, height: 400),
styleMask: [.closable, .miniaturizable, .titled],
backing: .buffered,
defer: true
).makeKeyAndOrderFront(nil)
app.delegate = appDelegate
app.setActivationPolicy(.regular)
app.finishLaunching()
while true {
if let ev = app.nextEvent(
matching: .any, until: .distantFuture, inMode: .default, dequeue: true
) {
app.sendEvent(ev)
}
await Task.yield() // This is causing random crashes
}
答: 暂无答案
评论
RunLoop
。您只需将自己的源/事件排队到实际的运行循环中即可。await Task.yield()
Task.yield()
NSApplication.run
AsyncArgumentParser.run
VZVirtualMachine.start