(Swift) 如何同步编写异步代码?

(Swift) How to make async code, synchronously?

我正在使用 Swift 进行申请。
我想从 FireStore 获取数据,但问题是应用程序在完成检索数据之前继续进行下一个作业。
所以我尝试使用这个“DispatchSemaphore”代码,但这会阻止应用程序工作...
我想知道如何等待 getDocument 闭包完成它的任务,然后转到下一步。

func changeTerms(uniqueName: String) {
        print("colRef: \(colRef.document(uniqueName).path)")
        let semaphore = DispatchSemaphore(value: 0)
        colRef.document(uniqueName).getDocument { snapShot, err in
            if let err = err {
                self.makeAlerts(title: "Error", message: err.localizedDescription, buttonName: "OK")
            } else {
                if let doc = snapShot, doc.exists {
                    if let data = doc.data() {
                        if let terms = data[K.Fstore.data.attributes] as? [String] {
                            var temp: [String] = []
                            for attIdx in self.rankedAttributes {
                                temp.append(terms[attIdx])
                            }
                            self.attributeTerms = temp
                            print("attributeTerms: \(self.attributeTerms)")
                            self.showTitle()
                            self.showTerm()
                        }
                    }
                }
            }
            semaphore.signal()
        }
        semaphore.wait()
    }

我 运行 遇到了与 Firebase 相同的问题,我使用 withCheckedContinuation() 找到了解决方案。您可以了解更多 here.

您的代码可以是:

let temp: [String] = await withCheckedContinuation { continuation in
        colRef.document(uniqueName).getDocument { snapShot, err in
            if let err = err {
                self.makeAlerts(title: "Error", message: err.localizedDescription, buttonName: "OK")
            } else {
                if let doc = snapShot, doc.exists {
                    if let data = doc.data() {
                        if let terms = data[K.Fstore.data.attributes] as? [String] {
                            var temp: [String] = []
                            for attIdx in self.rankedAttributes {
                                temp.append(terms[attIdx])
                            }
                            self.attributeTerms = temp
                            print("attributeTerms: \(self.attributeTerms)")
                            self.showTitle()
                            self.showTerm()
                        }
                    }
                }
            }
            continuation.resume(returning: temp)
        }
}

执行将等待变量 temp 获得一个值,然后再继续。

这仍然是一个异步代码,运行在后台运行,但它会运行顺序执行。