Добавление замыкания к чтению быстрой функции из базы данных Firebase - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть функция, которая делает вызов БД Firebase и возвращает цитату на основе даты. Поскольку данные не читаются сразу, функция возвращается до применения данных. Как я могу добавить закрытие, чтобы избежать этого? Я добавил «отпечатки», чтобы показать, как работает функция.

Спасибо!

func getQuoteFromDate(database: Firestore, dateVal: String) -> String {
    var dailyQuoteText = "Quote Text Base"
    let dbRef = database.collection("dailyQuotes")
    dbRef.whereField("date", isEqualTo: dateVal).getDocuments() { (querySnapshot, err) in
         if err != nil {
                dailyQuoteText = "Unable to Get Quote"
                print("Failed to get the item")
             } else {
                 for document in querySnapshot!.documents {
                    print("Checking for date " + dateVal)
                    let quoteVal = document.get("quote") as! String
                    let authorVal = document.get("author") as! String
                    dailyQuoteText = quoteVal + "\n\n -" + authorVal
                    print("Writing the quote " + dailyQuoteText)
                 }
             }
     }
    print("Returning the quote " + dailyQuoteText)
    return dailyQuoteText
}

Вывод:

Возвращение цитаты База текста цитаты

Проверка на дату 2020-04-05

Написание цитаты Вещи лучше всего работают для тех, кто умеет лучше всего работать.

1 Ответ

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

У вас есть недостаток дизайна. Звонки в Firestore являются асинхронными. Вы должны изменить свою философию дизайна. Например:

var dailyQuoteText:String = "Quote Text Base" {
    didSet {
        dailyQuoteFetched()
    }
}

var dateVal:String = "" {
    didSet {
        fetchNewDailyQuote(database:db)
    }
}

func fetchNewDailyQuote(database: Firestore) {
    // Here you could show a spinner to your users so 
    // that they would know that you are fetching info
    let dbRef = database.collection("dailyQuotes")
    dbRef.whereField("date", isEqualTo: dateVal).getDocuments() { (querySnapshot, err) in
         if err != nil {
                self.dailyQuoteText = "Unable to Get Quote"
                print("Failed to get the item")
             } else {
                 for document in querySnapshot!.documents {
                    print("Checking for date " + dateVal)
                    let quoteVal = document.get("quote") as! String
                    let authorVal = document.get("author") as! String
                    self.dailyQuoteText = quoteVal + "\n\n -" + authorVal
                    print("Writing the quote " + dailyQuoteText)
                 }
             }
     }
}

func dailyQuoteFetched() {
    // New quote is ready. Hide your spinner and display it
}
...