【发布时间】:2023-03-22 04:51:01
【问题描述】:
目前,我在将 Firebase 数据库中的数据加载到数组中的这段代码中遇到了一些问题。由于这是在 viewDidLoad 内部,我必须在将数据加载到其中之前清空我的数组food = [],如果我不这样做,它将复制所有对象,并且第二次加载时我将重复两次,第三次加载三次等等...但是由于多种原因,这不是一个好的解决方法,所以我想要的是它只会使用.childAdded 从数据库中添加新对象但是如果我只是用.childAdded 切换出.value 它会崩溃,我在这条线上得到一个Thread 1: signal SIGABRT:let dict = user_snap.value as! [String: String?]。我对 swift 很陌生,不知道如何解决这个问题,非常感谢一些帮助。
let parentRef = Database.database().reference().child("Recipes")
let storage = Storage.storage()
parentRef.observe(.value, with: { snapshot in
if ( snapshot.value is NSNull ) {
// DATA WAS NOT FOUND
print("– – – Data was not found – – –")
} else {
//Clears array so that it does not load duplicates
food = []
// DATA WAS FOUND
for user_child in (snapshot.children) {
let user_snap = user_child as! DataSnapshot
let dict = user_snap.value as! [String: String?]
//Defines variables for labels
let recipeName = dict["Name"] as? String
let recipeDescription = dict["Description"] as? String
let downloadURL = dict["Image"] as? String
let storageRef = storage.reference(forURL: downloadURL!)
storageRef.getData(maxSize: 1 * 1024 * 1024) { (data, error) -> Void in
let recipeImage = UIImage(data: data!)
food.append(Element(name: recipeName!, description: recipeDescription!, image: recipeImage!))
self.tableView.reloadData()
}
}
}
})
【问题讨论】:
-
用这一行更新你的代码以避免崩溃
if let dict = user_snap.value as? [String: String?] { }。还要检查user_snap对象的类型。当您的应用程序崩溃时,我确信它没有字典对象。 -
@Surjeet 我在
{ }里面放了什么? -
注释行“为标签定义变量”之后的代码。我已经在 for 循环中为您提供了第二行的更新版本
-
@Surjeet ok 将注释后的所有代码添加到括号中,它没有崩溃但是我的 tableView 现在是空的,数组也是。
-
@Surjeet 换句话说:括号内的代码不会运行,它会跳过它。
标签: ios arrays swift firebase firebase-realtime-database