【问题标题】:Function is returning before the Closure is finished Firebase函数在闭包完成之前返回 Firebase
【发布时间】:2015-02-17 13:24:45
【问题描述】:

我使用 Firebase 来存储数据,当我尝试使用它们的闭包函数检索数据时,总是会在闭包完成之前完成并返回。在我的 HeyUser 类中,我试图获取 Firebase 中 Friend 键中的值并将其存储在类属性中。然而,当试图实例化类的对象时,对象被实例化而没有得到 Friends 键的值。我想知道您是否能够延迟实例化或函数的完成,直到关闭完成。以下是我的 HeyUser 类的代码:

class HeyUser {
var Friends: [String] = [String]()
var username = PFUser.currentUser().username
var ref = Firebase()
var fRef = Firebase()

init() {
    self.ref = Firebase(url: "https://hey-chat.firebaseio.com/").childByAppendingPath("users").childByAppendingPath(PFUser.currentUser().username)
    self.fRef = self.ref.childByAppendingPath("friends")
    self.getFriends()
}

func getFriends() {
    self.fRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
        self.Friends = snapshot.value as [String]
        print("TEST")
        print(self.Friends.count)
        })
}

}

【问题讨论】:

标签: ios swift firebase


【解决方案1】:

我对 FireBase 不熟悉,并且仍然开始使用 Swift,但我可以告诉你,这就是异步网络的工作原理。

你调用一个函数并传入一个块(闭包)。该函数立即返回,并且在未来某个日期,当网络事务完成时,框架(在本例中为 firebase)调用您的闭包。

在使用这种架构时,你必须改变你的想法。您编写代码以发送请求,然后进入“待机模式”,等待请求完成。

【讨论】:

  • 是的,我明白这一点,但我想知道如何进入待机模式。如果您知道如何在 obj c 中执行此操作,那很好,我可以将其翻译成 swift。谢谢
  • 您只需让您的应用返回等待用户的输入。您确实需要添加代码,以防止用户在第一个请求完成之前再次发送相同的请求,并可能防止用户执行任何其他会导致当前请求失败的事情,除非他/她首先取消当前事务。具体情况取决于您的应用,因此很难为您提供具体信息。
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多