You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:31:18