在MainActor调用后asyncDetached回退到主线程

我正在尝试新的 async/await 东西。我的目标是test()在后台运行该方法,所以我使用asyncDetached; 但是在test()我需要在主线程上进行调用时,所以我使用了 MainActor。

(我意识到这可能看起来很复杂,但它是从一个更好的现实世界案例中缩减而来的。)

好的,所以测试代码看起来像这样(在视图控制器中):

override func viewDidLoad() {
    super.viewDidLoad()
    asyncDetached(priority: .userInitiated) {
        await self.test()
    }
}
@MainActor func getBounds() async -> CGRect {
    let bounds = self.view.bounds
    return bounds
}
func test() async {
    print("test 1", Thread.isMainThread) // false
    let bounds = await self.getBounds()
    print("test 2", Thread.isMainThread) // true
}

第一个print说我不在主线程上。这就是我所期望的。

但是,第二个print说,我在主线程上。那不是我所期望的。

感觉好像我神秘地回到主线程只是因为我调用了一个 MainActor 函数。我以为我会等待主线程,然后在我已经在的后台线程中恢复。

这是一个错误,还是我的期望错了?如果是后者,怎么我时走出主线程await,但再回来线程我是吗?我认为这正是 async/await 可以简化的事情......?

(在某种程度上,我可以通过在调用asyncDetached之后再次调用来“解决”问题getBounds;但那时我的代码看起来很像嵌套的 GCD,我不得不想知道为什么我要使用 async/await。)

也许我为时过早,但我继续将其作为错误提交:https : //bugs.swift.org/browse/SR-14756。


更多注意事项

我可以通过更换来解决问题

    let bounds = await self.getBounds()

    async let bounds = self.getBounds()
    let thebounds = await bounds

但这似乎不必要地详细说明,并不能使我相信原始现象不是错误。


我也可以通过使用演员来解决这个问题,这看起来是最好的方法。但同样,这并不能说服我我在这里注意到的现象不是错误。


我越来越相信这是一个错误。我刚刚遇到(并报告)了以下内容:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    async {
        print("howdy")
        await doSomeNetworking()
    }
}
func doSomeNetworking() async {
    print(Thread.isMainThread)
}

这打印howdy然后true。但是如果我们注释掉第一个打印,它会打印false. 添加或删除打印语句如何改变我们所在的线程?这当然不是故意的。

以上是在MainActor调用后asyncDetached回退到主线程的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>