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

时间:2018-05-10 01:20:24

标签: swift firebase asynchronous firebase-realtime-database

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

我知道在我实际做的事情中使用异步块之外的值是错误的,回调可以用来解决我的问题。我在网上看了很多例子,但我无法弄清楚如何在我的代码中实现它们。

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

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)

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您可以使用completionHandler,先在班级中声明typealias

typealias completion = (_ isFinished:Bool) -> Void

然后将 completionHandler 添加到您的函数中:

func fetchJSON(key: String, completionHandler: @escaping completion){
    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
    }

    meals.append(meal)
    completionHandler(true)
}

然后像这样调用你的函数:

fetchJSON(key: currentDate, completionHandler: { (isFinished) in
    if isFinished {
        // do Somthing
    }
})

答案 1 :(得分:0)

对于Firebase,您也可以找到方便的承诺。我使用PromiseKit库,它工作得很好。

你可以这样做:

find()