Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等待功能Swift/SwiftUI_Swift_Async Await_Swiftui - Fatal编程技术网

等待功能Swift/SwiftUI

等待功能Swift/SwiftUI,swift,async-await,swiftui,Swift,Async Await,Swiftui,我是swift和SwiftUI的新手,我有一个大问题,我希望有人能帮助我。事实上,我有一个函数,我使用了对firebase Db的调用,但函数在firebase响应之前结束。那么,有什么方法可以像swift中的等待一样呢?我试着自己去寻找,但我尝试的一切都不起作用 我放了一个代码示例,它可能会更清晰 扩展会话存储{ func校验参考码{ 让docRef=db.documentuser.referedby docRef.getDocument{document,文件中有错误 如果let docum

我是swift和SwiftUI的新手,我有一个大问题,我希望有人能帮助我。事实上,我有一个函数,我使用了对firebase Db的调用,但函数在firebase响应之前结束。那么,有什么方法可以像swift中的等待一样呢?我试着自己去寻找,但我尝试的一切都不起作用

我放了一个代码示例,它可能会更清晰

扩展会话存储{ func校验参考码{ 让docRef=db.documentuser.referedby docRef.getDocument{document,文件中有错误 如果let document=document,则存在document{ 让otherUser=self.changeReferralUserInformationdataDescription:文档 docRef.setDataotherUser self.user.moneyBalance=1 回来 }否则{ printNo转介代码 self.firestorerror=referralCode\u未验证 self.user.referedby= 回来 } } } 功能说明信息{ 如果self.user.referedby!={ self.checkReferralCode 如果self.firestorerror=={ /*它总是以这种方式运行,但在FireStore错误更改后1秒*/ 打印开始上载 自我决定型 }否则{ 回来 } } } 输出将是:

$>开始上传 $>无转介代码
将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 */
        }

我发现了一个使用信号量的答案,这里是教程的链接

这是密码


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()
        }
    }
}


希望能帮助他人

这是否回答了您的问题?如果您打印错误,在您将其更改为我的建议后,错误说明了什么?您声明docref的类是否仍然存在?向我们展示您的所有代码,以便我们可以帮助您。仅这几行代码没有说明任何内容…抱歉@Chris,我将整个code@CameronLittle我正在检查这不是全部代码-这只是一个扩展;向我们展示一个可编译的可运行示例…请看-顺便说一句,您没有做,我对您的变量提出的建议。。。