(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
获得一个值,然后再继续。
这仍然是一个异步代码,运行在后台运行,但它会运行顺序执行。
我正在使用 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
获得一个值,然后再继续。
这仍然是一个异步代码,运行在后台运行,但它会运行顺序执行。