实战需求
假设您有一个数组,并且您想遍历数组中的每个元素并调用一个obj.f接受该元素作为参数的函数。
f是异步的,几乎立即完成,但它调用在obj.
仅在前一个完成后匹配每个元素的最佳方法是什么?
这是一种方法:
let arr = ...
var arrayIndex = 0
var obj: SomeObj! // Required
obj = SomeObj(handler: {
...
arrayIndex += 1
if arrayIndex < arr.count {
obj.f(arr[arrayIndex])
}
})
obj.f(arr[0]) // Assumes array has at least 1 element
这工作正常,但并不理想。
我可以使用 a DispatchSemaphore,但这不是很好,因为它阻塞了当前线程。
此外,每个操作必须仅在前一个操作完成时运行的原因是因为我使用的 api 需要它(或者它会中断)
我想知道是否有更好/更优雅的方法来实现这一目标?
解决方案
你可以尝试使用 swift async/await,就像在这个例子中:
struct Xobj {
func f(_ str: String) async {
// something that takes time to complete
Thread.sleep(forTimeInterval: Double.random(in: 1..<3))
}
}
struct ContentView: View {
var obj: Xobj = Xobj()
let arr = ["one", "two", "three", "four", "five"]
var body: some View {
Text("testing")
.task {
await doSequence()
print("--> all done")
}
}
func doSequence() async {
for i in arr.indices { await obj.f(arr[i]); print("--> done \(i)") }
}
}
精品教程推荐
加入我们一起学习SwiftUI
QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com