SwiftUI 问答之 带闭包的for循环

实战需求

假设您有一个数组,并且您想遍历数组中的每个元素并调用一个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

发表回复