gpt4 book ai didi

ios - Swift优化嵌套异步调用

转载 作者:行者123 更新时间:2023-12-01 16:12:34 26 4
gpt4 key购买 nike

在这种情况下,我需要进行3个嵌套的异步调用来接收所需的数据。
因此,第二个 call 需要第一个 call 的数据,而第三个 call 需要第二个 call 的数据。我没有很多这样的情况。只有一个和另一个只有两个嵌套调用,所以我在考虑一种没有任何外部库的纯快速解决方案,但我对所有内容都开放。

由于我使用的是Firebase,是否最好将此逻辑移至CloudFunctions?那么要在后端准备呢?

FirestoreService().fetchCollection(query: query) { (result: Result<[Request], Error>) in
// do stuff
FirestoreService().fetchCollection(query: query) { (result: Result<[Request], Error>) in
// do stuff
FirestoreService().fetchDocument(documentReference: documentReference) { (result: Result<Package, Error>) in
// finish
}
}

}
}

最佳答案

如果您不使用第3方库,则可能要考虑将那些操作包装在某个类中,并以命令式方式使用闭包。

这是示例:

class CustomFirestoreHandler {

private var onFetchFirstQueryArrived: ((Result<[Request], Error>) -> ())? = nil
private var onFetchSecondQueryArrived: ((Result<[Request], Error>) -> ())? = nil
private var onFetchDocumentArrived: ((Result<Package, Error>) -> ())? = nil

init() {

onFetchFirstQueryArrived = { [weak self] (result: Result<[Request], Error>) in
self?.executeSecondQuery()
}

onFetchSecondQueryArrived = { [weak self] (result: Result<[Request], Error>) in
self?.executeFetchDocument()
}
}

func executeQuery(completion: @escaping (Result<Package, Error>) -> ()) {

self.onFetchDocumentArrived = completion

FirestoreService().fetchCollection(query: query) { [weak self] (result: Result<[Request], Error>) in

// validate if some error occurred and do early return here, so that we don't need necessarily call second query.
if (result.error == whatever) {
self?.onFetchDocumentArrived?(result)
return
}

self?.onFetchFirstQueryArrived?(result)
}
}

private func executeSecondQuery() {
FirestoreService().fetchCollection(query: query) { [weak self] (result: Result<[Request], Error>) in

// validate if some error occurred and do early return here, so that we don't need necessarily call fetch document.
if (result.error == whatever) {
self?.onFetchDocumentArrived?(result)
return
}

self?.onFetchSecondQueryArrived?(result)
}
}

private func executeFetchDocument() {
FirestoreService().fetchDocument(documentReference: documentReference) { (result: Result<Package, Error>) in
self?.onFetchDocumentArrived?(result)
}
}

}

这是上面 CustomFirestoreHandler的用法:
let firestoreHandler = CustomFirestoreHandler()
firestoreHandler.executeQuery { (result: Result<Package, Error>) in
// Handle `result` here...
}

我知道它看起来很复杂,但这是我认为(CMIIW)目前防止厄运金字塔的唯一方法,因为swift没有异步等待样式(就像javascript一样)。

关于ios - Swift优化嵌套异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61001767/

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