gpt4 book ai didi

ios - Swift - async/await - 在 MainActor Task 的后台线程上执行异步方法

转载 作者:行者123 更新时间:2023-12-05 08:03:58 31 4
gpt4 key购买 nike

这是我的 viewDidLoad 方法:

func viewDidLoad() {
// Stuff here
Task { @MainActor in
doSomeWorkOnMainThread1()
doSomeWorkOnMainThread2()

await doSomeBackgroundWork()

doSomeWorkOnMainThread3()
doSomeWorkOnMainThread4()
}
}

这是我的方法,应该在后台线程上执行工作:

func doSomeBackgroundWork() async {
// can add some code here
// long image processing task
assert(!Thread.isMainThread)
// can add some code here
}

是否可以在后台线程(不使用 GCD)上执行 doSomeBackgroundWork,然后等待它返回主线程?

最佳答案

您正在寻找 Task.sleep。请注意,它以纳秒为单位,这真的很奇怪,所以我写了一个扩展来切换到秒;要得到它,你必须使用 Double,而不是 Int:

extension Task where Success == Never, Failure == Never {
static func sleep(_ seconds:Double) async {
await self.sleep(UInt64(seconds * 1_000_000_000))
}
static func sleepThrowing(_ seconds:Double) async throws {
try await self.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
}
}

保证一项工作将在后台线程上完成的方法是将该工作交给 Actor。这就是 Actor 的用途(部分)。

例如,如果一个 Actor 有一个调用 Task.sleep 的方法 doSleep,那么如果您实例化该 actor 并从您的任务中调用该方法,它就会休眠在后台线程上。

关于ios - Swift - async/await - 在 MainActor Task 的后台线程上执行异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70758761/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com