繁体   English   中英

当Firebase功能在Swift中结束时

[英]When Firebase function ends in Swift

我在我的应用程序中使用Firebase,它查询大量用户并获取所需的特定数据,但是当它开始查询时-该功能的其余部分也保持运行,而不仅仅是查询,所以我无法理解当它结束时。

例如下面的代码:

ref.observeEventType(.ChildAdded, withBlock: { snapshot in

            let user = snapshot.value!.objectForKey("User")
            let name = (user!["Name"])! as! String

            print("name")

            })
print("done")

假设我们在Firebase数据库中有3个用户-打印的代码将是:

done
nameuser1
nameuser2
nameuser3

(或者done将在名称用户之间进行,取决于您的互联网连接-但它不会是最后一个)

Firebase回调块是异步的,而打印行是同步的。 这意味着,只要该块从其底层API调用接收回数据,该块就将运行,而该块外部的“打印”(和其他)行将继续顺序运行。

这就是为什么在运行回调块之前先运行打印行的原因。

您可以使用调度组,但前提是必须这样做,并且不应该在主线程上使用它。

看起来像这样:

 let group = dispatch_group_create()
 dispatch_group_enter(group)

ref.observeEventType(.ChildAdded, withBlock: { snapshot in

            let user = snapshot.value!.objectForKey("User")
            let name = (user!["Name"])! as! String

            print("name")
            dispatch_group_leave(group)

            })

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
//will reach here only after group_leave  is called
print("done")

您遇到的“问题”是由于函数observeEventType()是异步的。 因此,它会在实际获取值之前将控制权返回给其调用方。 使用这样的异步回调并传递一个函数,每次从firebase中检索值时都会调用该函数。

已为Swift 3更新

func getDataFromFirebase(callback: @escaping (_ user: String, _ name: String)->Void){
   ref.observeEvent(of: .childAdded, with:{(snapshot)-> Void in

        let user = snapshot.value!.objectForKey("User") as! String
        let name = (user!["Name"])! as! String

        callback(user, name)

   })
}

然后像这样调用函数

getDataFromFirebase(callback: {(user, name)-> Void in 
    print("got a user: \(user) and a name: \(name)")
})

这将为检索到的每个孩子打印一个用户和一个名字

让我们开始分析您的代码:

  • Firebase观察功能是异步的
  • 打印功能是同步的

    结果:不可能强迫一个asyc函数无法同步。

这只是一个错误的方法

关于编译器将如何编译您的代码:

首先,他将触发observeEventType函数,然后将其传递执行其他内容(这是因为它是异步的,需要时间来完成执行)。

对于您以所需方式进行这项工作的我的建议是,在viewDidLoad()函数中准备所有需要的数据(将它们放入变量中),而不仅仅是在私有函数中使用这些变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM