首页 > 解决方案 > 等待函数 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

标签: swiftasync-awaitswiftui

解决方案


我使用信号量找到了答案,这里是教程的链接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()
        }
    }
}

希望可以帮助某人


推荐阅读