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

用户专属歌曲收藏页崩溃求助:Firebase数据库查询异常

解决收藏页崩溃+仅显示个人收藏的问题

嘿,我来帮你搞定这个问题!你的崩溃根源和功能问题其实是同一个点:强制解包未登录用户的UID,同时数据解析也存在潜在的崩溃风险。我给你一步步拆解修复方案:

为什么加UID子路径会崩溃?

你写的var _favs = database.child("favs").child("\(Auth.auth().currentUser!.uid)")里用了!强制解包currentUser,如果用户还没登录(或者登录状态失效),currentUser会是nil,这行代码直接触发崩溃。而移除UID子路径后,跳过了这个解包步骤,所以能运行,但会拉取favs节点下的所有数据,也就是所有用户的收藏。

修复步骤

1. 安全获取当前用户UID

永远不要用!强制解包currentUser,改用可选绑定来安全获取用户ID:

guard let currentUserId = Auth.auth().currentUser?.uid else {
    // 这里可以处理用户未登录的场景,比如弹出登录提示、跳转登录页
    print("用户未登录,无法访问个人收藏")
    return
}
// 现在可以安全创建个人收藏的数据库引用了
let favsRef = database.child("favs").child(currentUserId)

2. 优化收藏数据获取函数

你的getAllFavourite函数不仅要修复UID的问题,还要优化数据解析的安全性(避免用as!强制转换,防止数据格式错误导致崩溃)。修改后的完整函数:

func getAllFavourite(handler: @escaping (_ fav: [AlbumModel]) -> () ) {
    // 先验证用户登录状态
    guard let currentUserId = Auth.auth().currentUser?.uid else {
        handler([]) // 返回空数组,或者根据业务需求处理未登录情况
        print("用户未登录,无法获取个人收藏")
        return
    }
    
    let favsRef = database.child("favs").child(currentUserId)
    var favsArray = [AlbumModel]()
    
    favsRef.observeSingleEvent(of: .value) { (favSnapshot) in
        // 安全转换快照子节点
        guard let favSnapshots = favSnapshot.children.allObjects as? [DataSnapshot] else {
            handler(favsArray)
            return
        }
        
        for snapshot in favSnapshots {
            // 用可选绑定解析每个字段,避免强制解包崩溃
            guard let title = snapshot.childSnapshot(forPath: "title").value as? String,
                  let songId = snapshot.childSnapshot(forPath: "storeId").value as? String,
                  let artist = snapshot.childSnapshot(forPath: "artist").value as? String,
                  let senderId = snapshot.childSnapshot(forPath: "senderId").value as? String else {
                // 如果某条数据字段缺失/格式错误,跳过这条继续处理下一条
                continue
            }
            
            let favAlbum = AlbumModel(artist: artist, senderId: senderId, title: title, storeId: songId)
            favsArray.append(favAlbum)
        }
        handler(favsArray)
    }
}

3. 提前拦截未登录场景

在进入收藏页之前,先做登录状态验证,比如在收藏页的viewWillAppear方法里:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if Auth.auth().currentUser == nil {
        // 跳转登录页面,或者提示用户登录
        let loginVC = LoginViewController() // 替换成你的登录控制器
        navigationController?.pushViewController(loginVC, animated: true)
    }
}

这样就能确保只有登录用户才能进入收藏页,同时避免了UID解包的崩溃问题,还能保证只拉取当前用户的收藏歌曲。

内容的提问来源于stack exchange,提问作者terry bridges

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:58:22