gpt4 book ai didi

swift - 如何在循环中处理异步函数?

转载 作者:行者123 更新时间:2023-11-28 06:06:03 25 4
gpt4 key购买 nike

我正在遍历一个表的行,对于它们中的每一行,我都在执行几个异步调用,例如从 API 获取数据、复制文件、运行 shell 脚本...我如何等待结果直到转到下一个。

我也是 Swift 的新手,不确定这是否是处理一组异步任务的最佳方式。在这种情况下我应该使用并发吗?

tableView.selectedRowIndexes.forEach { row in
myData.fetch(url: urlList[row]) { res in
self.anotherAsyncCall(res) { data in
//continue to deal with next row now
}
}
}

最佳答案

如果你真的想按顺序执行此操作,最简单的方法是递归执行你的任务,实际上是在前一个任务的完成处理程序中调用下一个任务:

processNext(in: tableView.selectedRowIndexes) {
// do something when they're all done
}

地点:

func processNext(in rows: [Int], completion: @escaping () -> Void) {
guard let row = rows.first else {
completion()
return
}

myData.fetch(url: urlList[row]) { res in
self.anotherAsyncCall(res) { data in
//continue to deal with next row now

self.processNext(in: Array(rows.dropFirst()), completion: completion)
}
}
}

但我同意 GoodSp33d 的观点,另一种方法是将此异步过程包装在自定义的异步 Operation 子类中。


但这引出了一个问题,为什么要按顺序执行这些操作。由于每个请求的固有网络延迟,您将付出显着的性能损失。所以另一种方法是让它们同时运行,并使用调度组来知道它们何时完成:

let group = DispatchGroup()

tableView.selectedRowIndexes.forEach { row in
group.enter()
myData.fetch(url: urlList[row]) { res in
self.anotherAsyncCall(res) { data in
//continue to deal with next row now
group.leave()
}
}
}

group.notify(queue: .main) {
// do something when they're all done
}

您是否可以同时运行这些(或在何种程度上)取决于您在各种异步方法中所做的事情。但我建议您仔细考虑同时进行这项工作,因为性能可能会好得多。

关于swift - 如何在循环中处理异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180134/

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