我希望有一种使用@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
。
正确的方法是什么?我需要一种全局变量,在我的应用程序启动之前可以进行初始化。