gpt4 book ai didi

swift - 许多任务中的一种方法 async/await

转载 作者:行者123 更新时间:2023-12-05 01:53:45 26 4
gpt4 key购买 nike

您好,我有一个案例需要在多个任务中调用相同的方法。我希望有可能在并行模式下一个一个地调用这个方法(同步)。看起来像这样:

var isReadyToRefresh: Bool = true

func refresh(value: Int) async {
try! await Task.sleep(nanoseconds: 100_000_000) // imitation API CALL
isReadyToRefresh = false
print("Try to refresh: \(value)")
}

func mockCallAPI(value: Int) async {
if isReadyToRefresh {
await refresh(value: value)
}
}

Task {
await mockCallAPI(value: 1)
}

Task {
await mockCallAPI(value: 2)
}

输出:

Try to refresh: 1

Try to refresh: 2

我需要的输出:

Try to refresh: 1 OR Try to refresh 2. Depends which task has been called as first one.

有什么想法吗?

最佳答案

你说:

I want [the second attempt] to wait for the first refresh API finish

您可以保存对您的Task 的引用,如果找到,await。如果没有找到,则开始任务:

actor Refresh {
var task: Task<Void, Never>?

func refresh(value: Int) async {
try! await Task.sleep(nanoseconds: 100_000_000) // imitation API CALL
print("Try to refresh: \(value)")
}

func mockCallAPI(value: Int) async {
if let task = self.task {
_ = await task.result
return
}

task = Task {
await refresh(value: value)
task = nil
}
}
}

Apple 在随 WWDC 2021 视频提供的代码中展示了此模式的示例,Protect mutable state with Swift actors (但此代码不在网站上;仅在 Developer 应用程序中提供)。参见 How to prevent actor reentrancy resulting in duplicative requests?

他们的例子比较复杂(一种避免重复的网络请求被一些图像缓存/下载器发起的模式),但是思想的内核是一样的:保存并await >任务

关于swift - 许多任务中的一种方法 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71037126/

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