在Firebase中,检索到的数据无法从.observeEventType方法

时间:2016-09-07 11:30:50

标签: ios swift firebase firebase-realtime-database

我在项目中定义了一个类来管理我在Firebase中设置的数据库。以下是我到目前为止在课堂上所做的工作。

import Foundation
import Firebase

class db{
    class func getPrim() -> [String]{
        var ret = [String]()

        let ref = FIRDatabase.database().reference()

        ref.child("bunya1").observeEventType(FIRDataEventType.Value, withBlock: {
            s in

            ret = s.value! as! [String]

        })

        print("ret: \(ret)")
        return ret
    }
}

该方法在print()方法中调用,如print(db.getPrim())。但是控制台(或终端?无论如何,xcode底部的屏幕......)所说的只是一个空数组。我用print("-----------------------")接受了上述陈述。

-----------------------
ret: []
[]
-----------------------
2016-09-07 20:23:08.808 이모저모[36962:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-09-07 20:23:08.815 이모저모[36962:] <FIRAnalytics/INFO> Firebase Analytics enabled

ret方法中的.observeEventType()似乎没有将其值从方法块中删除。据我所知,数据应该保留。任何人都可以给我一个提示吗?我仍然不了解作为方法参数的代码块是如何工作的。日Thnx !!

2 个答案:

答案 0 :(得分:3)

根据定义,所有firebase操作都是异步的,这意味着您的程序在转到代码中的下一个语句之前不会等待来自firebase的数据。因此,在调用print语句时,还没有获取来自firebase的数据。

请查看this answer了解详情。

答案 1 :(得分:0)

André(以及Vikrum答案的链接)确实是这种情况发生的原因。但是,如果在代码中添加一些日志语句,通常最容易理解:

class func getPrim() -> [String]{
    let ref = FIRDatabase.database().reference()

    print("Before observer");
    ref.child("bunya1").observeEventType(FIRDataEventType.Value, withBlock: {
        s in

        print("In observer block");

    })
    print("After observer");

    return "..."
}

运行此代码时,日志记录将按以下顺序进行:

  

在观察者之前

     

观察员之后

     

观察者回调

这可能不是您期望它们出现的顺序。但它肯定解释了为什么你在你的代码片段中返回一个空数组。如果块中的代码尚未运行,则该项尚未添加到阵列中。

这个顺序被颠倒的原因是André和Vikrum说:对Firebase的调用是异步发生的。由于它可能需要一些时间(特别是如果这是您第一次访问数据库),Swift代码将继续执行以确保应用程序保持响应。一旦数据从Firebase返回,您的块就会被调用(因此它有时被称为“回调”)并且您获得了数据。