如何正确返回数据并将其存储在变量中

时间:2018-02-16 14:17:17

标签: swift firebase firebase-realtime-database

为了尝试将MVVM实现到我的项目中,我已将Firebase代码结构移出到存储库。然后我想将一个数组从Firebase循环返回到先前驻留的Firebase代码的类(MyCollectionViewClass)。

在viewDidLoad上面声明:

var imageArray = [Recipe]()

在viewDidLoad中:

imageArray = firebaseReference!.getFirebaseData(dataRecieverStringCollectionView: 
(self.dataRecieverStringCollectionView as? String)!)

firebaseReference!.getFirebaseData是对存储库类及其功能的引用。

self.dataRecieverStringCollectionView是传递给函数的字符串值(我已经检查过它确实包含正确的字符串值)

我尝试了许多不同的包装/展开组合而没有成功。我得到的错误是Unexpectedly found nil while unwrapping an Optional value之前一切正常,所以只是这个代码转换搞砸了项目。

存储库类中的实际Firebase代码如下所示:

func getFirebaseData(dataRecieverStringCollectionView: String) -> Array<Recipe>{
    databaseRef = Database.database().reference()             
    storageRef = Storage.storage().reference()

databaseRef!.child(dataRecieverStringCollectionView).observeSingleEvent(of: .value, with: {(snapshot) in
        for item in snapshot.children.allObjects as! [DataSnapshot] {
            let thisItem = item.value as! NSDictionary

            let tempRecipe = Recipe()
            tempRecipe.fbKey = item.key
            tempRecipe.recipeImageObject = (thisItem["recipeImageFirebase"] as! String)
            tempRecipe.recipeHeaderObject = (thisItem["recipeHeaderFirebase"] as! String)
            tempRecipe.recipeTextObject = (thisItem["recipeIngredientsTextFirebase"] as! String)

            self.imageArray.append(tempRecipe)
        }
    })
    return imageArray
}

不确定问题是什么。我返回[Recipe]并尝试将其存储在调用该方法的类中的[Recipe]变量中。函数中的返回类型是否有误?还有其他我错过的东西?提前致谢! :)

1 个答案:

答案 0 :(得分:1)

Firebase实时数据库API是异步的。这意味着observeSingleEvent()等方法在调用时立即返回,并且在数据可用时稍后调用您提供给它的回调。无法保证接收数据需要多长时间。

在您的代码中,您在之前返回imageArray ,它会被回调中的数据填充。你基本上试图使异步API同步,这不是一个好主意。如果要在函数中包装异步RTDB方法,该函数也应该是同步的。

Please read this blog有关Firebase API异步以及对它们的期望的更多信息。