swift - 等待函数 Swift/SwiftUI
问题描述
我是 swift 和 SwiftUI 的新手,我遇到了一个大问题,希望有人能帮助我。事实上,我有一个函数是我使用对firebase Db的调用,但函数在firebase响应之前结束。那么有什么办法可以像 swift 中的 await 一样做吗?我试图自己找到,但我尝试的一切都不起作用。
我放了一个代码示例,它可能会更清晰。
extension SessionStore {
func checkReferralCode(){
let docRef = db.document(user.referredBy)
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let otherUser = self.changeReferralUserInformation(dataDescription: document)
docRef.setData(otherUser)
self.user.moneyBalance = 1
return
} else {
print("No referral Code")
self.firestoreError = "referralCode_unvalid"
self.user.referredBy = ""
return
}
}
}
func doInscriptionInformation() {
if (self.user.referredBy != "") {
self.checkReferralCode()
if (self.firestoreError == "" ) {
/* it's always go in this way but 1 secs after the firestoreError change */
print("START UPLOAD")
self.determineUploadType()
} else {
return
}
}
}
输出将是:
$> START UPLOAD
$> No referral Code
解决方案
我使用信号量找到了答案,这里是教程的链接https://medium.com/@roykronenfeld/semaphores-in-swift-e296ea80f860
这里的代码
func checkReferralCode(semaphore: DispatchSemaphore){
let docRef = self.db.document(self.user.referredBy)
semaphore.wait()
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let otherUser = self.changeReferralUserInformation(dataDescription: document)
docRef.setData(otherUser)
self.user.moneyBalance = 1
semaphore.signal()
} else {
self.firestoreError = "referralCode_unvalid"
self.user.referredBy = ""
semaphore.signal()
}
}
}
func doInscriptionInformation() {
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global(qos: .userInteractive).async {
if (self.user.referredBy != "") {
self.checkReferralCode(semaphore: semaphore)
semaphore.wait()
if (self.firestoreError == "" ) {
self.determineUploadType()
}
else {
print("No good referral code")
}
semaphore.signal()
}
}
}
希望可以帮助某人
推荐阅读
- javascript - 状态更新被另一个(以前的)状态更新覆盖?
- multithreading - 为什么在添加执行任务的线程数时执行时间更长?
- python - 绘制 np.linspace 时,图形标签不是我想要的
- transactions - Arules:如何从 lhs/rhs 获取某些项集
- sql - 使用 Azure Active Directory 身份验证的行级安全性 - WEB API
- node.js - 有没有办法使用 fs 向 json 对象添加数据
- python - 删除双链表中的每隔一个字符
- azure-devops - Azure Pipelines 维护多个国家/地区/环境
- javascript - 如何使用 JavaScript 防止 textarea 元素上的跨站请求伪造 (CSRF)?
- javascript - 如何在 Firestore 查询中过滤掉某些文档