【问题标题】:Await function Swift/SwiftUI等待函数 Swift/SwiftUI
【发布时间】:2020-04-01 15:06:24
【问题描述】:

我是 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

【问题讨论】:

  • 这能回答你的问题吗? How to make async / await in Swift?
  • 如果您打印(错误),在您将其更改为我的建议后,该错误是什么意思?您声明 docref 的类是否仍然存在?向我们展示您的所有代码,以便我们为您提供帮助。就这几行什么都没说......
  • 对不起@Chris,我放了整个代码
  • @CameronLittle,我正在检查这种方式
  • 这不是完整的代码——这只是一个扩展;)向我们展示一个可编译的可运行示例...pleeeeease——顺便说一句,你没有做,我对你的变量提出的建议。 ..

标签: swift async-await swiftui


【解决方案1】:

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

希望能帮助到别人

【讨论】:

    【解决方案2】:

    使 docRef 成为类的变量,而不是像这样的局部变量:

     class WhateverClassNameYouHave: InheritedClass {
        let docRef : DocRef (whatever type it is)
    
    
         func checkCode() {
             self.docRef = /* get firebase doc */
              /* Call to firebase function */
              docRef.getDocument { (document, error) in
                      /* Do my stuff*/
                  } else {
                      /*change variable to error*/
                      self.firestoreError = "referralCode_unvalid"
                  }
              }
              /*But the fonction end before the response of firebase so my self.firestoreError  isn't update */
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2023-03-13
      相关资源
      最近更新 更多