提问人:Alejandro 提问时间:10/11/2023 最后编辑:Alejandro 更新时间:11/14/2023 访问量:66
Task.detached 在初始化时崩溃
Task.detached crashing on init
问:
这个空应用程序在加载时崩溃。我正在尝试异步执行应用程序加载的函数,但它一直崩溃。我正在运行 macOS v11 (Big Sur) 和 Xcode 13 和 Swift 5.5,但找不到它有什么问题。
import SwiftUI
@main
struct TestApp: App {
init() {
Controller.shared.load()
}
var body: some Scene {
WindowGroup {
VStack {
Text("Hello")
}
}
}
}
class Controller: ObservableObject {
static let shared = Controller()
@Published public var loaded = false
@Published public var processing = false
func load() {
Task.detached {
print("Hello")
}
}
}
编辑:
它编译并运行,但立即崩溃。没有错误消息,它只是崩溃了
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
上。如果您注释掉 Task.detached 块,它会正常运行,但当然它不会开始在后台加载对象,这是我实际上要做的。Controller.shared.load()
答:
0赞
malhal
10/11/2023
#1
在 SwiftUI 中,它根本不需要也不需要任何对象,例如.task
Task {}
import SwiftUI
@main
struct TestApp: App {
// init() {
// Controller.shared.load()
// }
var body: some Scene {
WindowGroup {
VStack {
Text("Hello")
.task {
print("Hello")
// or await a func declared outside the main actor context for a background thread
}
}
}
}
}
//class Controller: ObservableObject {
//
// static let shared = Controller()
//
// @Published public var loaded = false
// @Published public var processing = false
// func load() {
// Task.detached {
// print("Hello")
// }
// }
//}
评论
0赞
Alejandro
10/11/2023
我正在开发 Big Sur (macOS 11)。.task API 仅适用于 macOS 12。该对象当然不是必需的,但它是我尝试在加载时异步初始化的对象。这种模式适用于我参与的其他应用程序,但不知何故,如果我从头开始一个新的空项目,它会在 Task.detached 上崩溃。
0赞
malhal
10/11/2023
你几乎从不想要.您可以使用 和 自行重新实现 .task,并在某种状态下保留任务句柄。所以我只是用谷歌搜索了一下,找到了一个你可以尝试的:github.com/shaps80/SwiftUIBackports/blob/main/Sources/......Task.detached
onAppear
onDisappear
0赞
Alejandro
11/14/2023
#2
回答我自己的问题,这似乎是与 Xcode 13.2.1 和 macOS 11.7 版本相关的错误。如果项目使用 11.7 作为“部署目标”,我会崩溃,但如果我将其更改为 11.6,它将正常工作。去想想。
评论