swift - 如何等待异步任务结束 - Swift 4

标签 swift firebase asynchronous firebase-realtime-database

我需要从 Firebase 数据库读取数据并将数据插入到结构中,稍后我将在该结构上执行一些操作。我现在面临的问题是,由于 Firebase 以异步方式管理这些事情,当我检查结构内部时,它通常是 nil 并且尚未填充数据。

我知道像我实际上所做的那样使用异步 block 之外的值是错误的,并且可以使用回调来解决我的问题。我在网上阅读了很多示例,但我不知道如何在我的代码中实现它们。

为了简单起见,在下面的示例中,我只从数据库下载一个对象。

func fetchJSON(key: String) -> Void {
  var meal = Meal()
  let ref = rootRef.child(key)

  ref.observe(.value) { (snap: DataSnapshot) in   
      meal.firstMeal = snap.childSnapshot(forPath: "first").value as! String
      meal.secondMeal = snap.childSnapshot(forPath: "second").value as! String
      meal.thirdMeal = snap.childSnapshot(forPath: "third").value as! String         
    }

  self.meals.append(meal)
}

函数调用如下所示:

fetchJSON(key: currentDate)

有人可以帮我吗?

最佳答案

对于 Firebase,您还可以找到方便的 Promise。我用PromiseKit图书馆,它工作得很好。

你可以这样做:

fetchJSON(key: currentDate).done { meal in
    print(meal)
}

func fetchJSON(key: String) -> Promise<Meal> {
        let ref = rootRef.child(key)
        return Promise { seal in
            ref.observe(.value) { (snap: DataSnapshot) in
                guard let firstMeal = snap.childSnapshot(forPath: "first").value as! String,
                      let secondMeal = snap.childSnapshot(forPath: "second").value as! String,
                      let thirdMeal = snap.childSnapshot(forPath: "third").value as! String {
                        let meal = Meal(firstMeal: firstMeal, 
                                        secondMeal: secondMeal, 
                                        thirdMeal: thirdMeal)
                            seal.fulfill(meal)
                    }
                }
            }
        }

关于swift - 如何等待异步任务结束 - Swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50264169/

相关文章:

python - 异步 : collecting results from an async function in an executor

c# - IAsyncEnumerable 或 IAsyncEnumerator 的工厂

wpf - 如何在双向绑定(bind)组合框 (WPF) 上调用异步操作

ios - Firebase iOS 的 getIDTokenForcingRefresh 严格来说并不比 getIDToken 好

swift - 在 Swift 中寻找 "exit"等价物

ios - iOS 9+ 问题的 Branch.io 链接

ios - 如何在 ios 中的 Google map 上显示特定路线的实时交通数据

firebase - 火存储 : prevent abuse from public apiKey

C# 编排和 firestore

ios - Swift 中的 Objective-C block 出现问题