用户专属歌曲收藏页崩溃求助: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
相关产品推荐
相关产品推荐

