我想要某种使用同步的全局变量@MainActor
。
这是一个示例结构:
@MainActor
struct Foo {}
我想要一个像这样的全局变量:
let foo = Foo()
但是,这不会编译并与Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context
.
很公平。我试图在主线程上构建它,如下所示:
let foo = DispatchQueue.main.sync {
Foo()
}
这编译!但是,它会崩溃EXC_BAD_INSTRUCTION
,因为DispatchQueue.main.sync
无法在主线程上运行。
我还尝试创建一个包装函数,例如:
func syncMain<T>(_ closure: () -> T) -> T {
if Thread.isMainThread {
return closure()
} else {
return DispatchQueue.main.sync(execute: closure)
}
}
并使用
let foo = syncMain {
Foo()
}
但是编译器无法识别if Thread.isMainThread
并再次抛出相同的错误消息,Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context
.
这样做的正确方法是什么?我需要某种可以在应用程序启动之前初始化的全局变量。