Функция ожидания Swift / SwiftUI - PullRequest
0 голосов
/ 01 апреля 2020

Я новичок в Swift и SwiftUI, и у меня большая проблема, я надеюсь, что кто-то может мне помочь. На самом деле, у меня есть функция, в которой я использую вызов для firebase Db, но функция завершается до ответа firebase. Так есть ли способ сделать как ждать в Свифте? Я пытаюсь найти сам, но все, что я пытаюсь, не работает.

Я положил образец кода, возможно, он будет более понятным.

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Я нашел ответ, используя семафор, здесь ссылка на учебник 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()
        }
    }
}

Надеюсь, что может помочь кому-то

0 голосов
/ 01 апреля 2020

делает 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 */
        }
...