Swift中如何从Firebase Database获取指定数据并存入数组
解决Firebase数据读取与数组存储问题
嘿,我来帮你搞定这个Firebase数据读取的问题!先理清楚你的数据结构:category/book下面有firstBook和secondBook两个子节点,每个都带name字段,另外firstBook里还有个Quotes节点,装着Quote1、Quote2、Quote3三个引用内容对吧?
一、捕获所有Book的名称存入数组
你原来的代码踩了个小坑:直接从book节点的value里取name,但book本身是包含两个子节点的父节点,不是单个book对象,所以得遍历它的子节点才能拿到每个book的name。
修正后的代码:
// 定义存储book名称的数组 var bookNamesArray: [String] = [] override func viewDidLoad() { super.viewDidLoad() let bookRef = Database.database().reference().child("category").child("book") bookRef.observe(.value, with: { snapshot in // 先清空数组,避免重复添加旧数据 self.bookNamesArray.removeAll() // 遍历book节点下的所有子节点(也就是firstBook、secondBook) for childSnapshot in snapshot.children { guard let child = childSnapshot as? DataSnapshot, let bookDict = child.value as? [String: Any], let bookName = bookDict["name"] as? String else { continue } self.bookNamesArray.append(bookName) } // 划重点:Firebase回调在后台线程,更新UI必须切回主队列! DispatchQueue.main.async { print("Book名称数组:\(self.bookNamesArray)") // 这里可以加UI刷新操作,比如 tableView.reloadData() } }) }
二、捕获firstBook中的所有Quote存入数组
你原来的代码把Quotes当成了字符串类型,但实际上它是一个包含三个子节点的父节点,所以得遍历Quotes的子节点来提取每个引用内容。
修正后的代码:
// 定义存储Quote的数组 var quotesArray: [String] = [] override func viewDidLoad() { super.viewDidLoad() let firstBookQuotesRef = Database.database().reference().child("category").child("book").child("firstBook").child("Quotes") firstBookQuotesRef.observe(.value, with: { snapshot in // 清空数组,避免重复数据 self.quotesArray.removeAll() // 遍历Quotes下的所有子节点(Quote1、Quote2、Quote3) for quoteSnapshot in snapshot.children { guard let quoteChild = quoteSnapshot as? DataSnapshot, let quoteContent = quoteChild.value as? String else { continue } self.quotesArray.append(quoteContent) } // 同样要切回主队列更新UI DispatchQueue.main.async { print("Quote数组:\(self.quotesArray)") // 这里做UI刷新 } }) }
几个实用小提示
- 尽量用Swift原生的
[String: Any]替代NSDictionary,类型更安全,避免不必要的类型转换问题 - 每次获取新数据时记得清空数组,不然旧数据会一直累加
- 如果只需要读取一次数据(不需要实时监听变化),可以用
observeSingleEvent(of: .value)代替observe(.value),性能更优 - 永远记得在主队列更新UI,不然会触发线程崩溃
内容的提问来源于stack exchange,提问作者Andrew0
相关产品推荐
相关产品推荐

