为了尝试将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]
变量中。函数中的返回类型是否有误?还有其他我错过的东西?提前致谢! :)
答案 0 :(得分:1)
Firebase实时数据库API是异步的。这意味着observeSingleEvent()等方法在调用时立即返回,并且在数据可用时稍后调用您提供给它的回调。无法保证接收数据需要多长时间。
在您的代码中,您在之前返回imageArray
,它会被回调中的数据填充。你基本上试图使异步API同步,这不是一个好主意。如果要在函数中包装异步RTDB方法,该函数也应该是同步的。
Please read this blog有关Firebase API异步以及对它们的期望的更多信息。