gpt4 book ai didi

ios - PromiseKit for In Loop 实现时

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

使用 Swift,我第一次尝试使用 PromiseKit 将 promises 合并到我的代码中,但我很难从语法上理解如何实现它。

我的目标是通过管道将请求传递给 Firebase 以获取数据,并在附加数组中包含所有返回数据后执行另一个方法。似乎 promise 已解决,并且在使用数据设置数组之前运行 final方法。我相信我应该使用“when”,但不可否认在理解文档时遇到了困难。

缩写,相关代码如下:

getPosts(ids).done {
runningFinalMethod(self.arr)
}

func getPosts(_ ids: [String]) -> Promise<Void> {
return Promise { seal in
for id in ids {
db.collection("data").whereField("id", isEqualTo: id).getDocuments(completion: { (dataForId, error) in
appendData(dataForId)
})
}
seal.fulfill(())
}
}

func appendData(_ dataForId: [data]) {
arr.append(contentsOf: dataForId)
}

最佳答案

最好使用thenMap在这些情况下,您正在异步映射多个值。这是您可以实现此目标的方法

func getPosts(_ ids: [String]) -> Promise<Void> {
return Promise.value(ids).thenMap { id in
Promise<data> { resolver in
db.collection("data").whereField("id", isEqualTo: id).getDocuments { dataForId, error in
guard let error = error else { resolver.fulfill(dataForId) }
resolver.reject(error)
}
}
}
.done { allDataForIds in
self.arr = allDataForIds
}
.catch { error in
// handle error
}
}

thenMap允许您映射单个值,然后使用 Promise 处理该值.然后您可以使用 done 收集所有值方法,它具有来自每个集合 promise 的所有值。顺便说一下,done方法本身返回 Promise<Void> ,您可以在最后简单地返回它。

关于ios - PromiseKit for In Loop 实现时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626068/

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