Task.detached 在初始化时崩溃

Task.detached crashing on init

提问人:Alejandro 提问时间:10/11/2023 最后编辑:Alejandro 更新时间:11/14/2023 访问量:66

问:

这个空应用程序在加载时崩溃。我正在尝试异步执行应用程序加载的函数,但它一直崩溃。我正在运行 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()

异步 SwiftUI 任务

评论

0赞 lorem ipsum 10/11/2023
应启用“严格并发”,此方法不安全,并应用标志进行争用警告。旧版本可能有效,因为竞争警告已在新的并发中进行

答:

0赞 malhal 10/11/2023 #1

在 SwiftUI 中,它根本不需要也不需要任何对象,例如.taskTask {}

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.detachedonAppearonDisappear
0赞 Alejandro 11/14/2023 #2

回答我自己的问题,这似乎是与 Xcode 13.2.1 和 macOS 11.7 版本相关的错误。如果项目使用 11.7 作为“部署目标”,我会崩溃,但如果我将其更改为 11.6,它将正常工作。去想想。