Ios 当Firebase函数在Swift中结束时

Ios 当Firebase函数在Swift中结束时,ios,swift,xcode,firebase,firebase-realtime-database,Ios,Swift,Xcode,Firebase,Firebase Realtime Database,我在我的应用程序中使用了Firebase,它通过许多用户进行查询并获取所需的特定数据,但当它开始查询时,其余功能也会继续运行,而不仅仅是查询,因此我无法理解它何时结束 例如,在本代码中: ref.observeEventType(.ChildAdded, withBlock: { snapshot in let user = snapshot.value!.objectForKey("User") let name = (user!["Name"

我在我的应用程序中使用了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
将位于nameusers之间的某个位置,具体取决于您的internet连接-但它不会是最后一个)

Firebase回调块是异步的,而打印行是同步的。这意味着,每当块从其基线API调用接收回数据时,它都将运行,而块外部的“打印”(和其他)行将继续按顺序运行


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

您可以使用dispatch group,但前提是必须使用,并且不应该在主线程上使用

看起来是这样的:

 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")

让我们从分析代码开始:

  • firebase观察功能是异步的

  • 打印功能是同步的

    结果:不可能强制asyc func以同步方式工作

这只是一种错误的方法

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

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

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

您遇到的“问题”是由于函数
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)")
})

这将为检索到的每个子级打印用户和名称

这是异步函数调用back@WeiJay但是,当Firebase函数结束时,我能做些什么来运行另一个代码吗?你确切知道有多少回调(用户)?@WeiJay没有,但每次都在增长。添加一个孩子后,你打算做什么?或者你想在添加所有子项后做些什么?你是100%正确的,但是当Firebase函数结束时,我可以做些什么来运行另一个代码吗?