实施时的PromiseKit for In循环

时间:2018-04-03 09:01:14

标签: ios swift firebase promise promisekit

使用Swift,我试图首次将promises与PromiseKit合并到我的代码中,并且很难在语法上理解如何使其工作。

我的目标是将请求传递给Firebase以获取数据,并在使用所有返回的数据完成附加数组后执行另一个方法。似乎promise已解决,并且在使用数据设置数组之前运行最终方法。我相信我应该使用“何时”,但无可否认地理解文档。

以下缩写相关代码:

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)            
}

1 个答案:

答案 0 :(得分:2)

最好在这些情况下使用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方法收集所有值,该方法包含每个集合承诺的所有值。顺便说一句,done方法本身返回Promise<Void>,你可以在结尾处返回。