从 firebase 检测值并从 superView 中删除(如果为真)

Posted

技术标签:

【中文标题】从 firebase 检测值并从 superView 中删除(如果为真)【英文标题】:detect value from firebase and remove from superView if is true 【发布时间】:2021-01-04 01:37:14 【问题描述】:

我有一个与 tinder 非常相似的 cardView。我正在尝试检测用户是否刷过,如果用户刷过,请从 superView 中移除卡片。

我的 firebase 结构看起来像,

我尝试移除卡的方式是,

func fetchUserSwipes() 
        let uid = Auth.auth().currentUser?.uid
        Database.database().reference().child("userSwipesForCU").child(uid!).observe(.childAdded, with:  (snapshot) in
            if let userDictionary = snapshot.value as? [String: AnyObject] 
                let user = User(dictionary: userDictionary as [String : AnyObject])
                self.user = user
                
                let poster = Poster(dictionary: userDictionary as [String : AnyObject])
                let cardView = self.setupCardFromUser(poster: poster)
                
    
                if snapshot.exists()
                    cardView.removeFromSuperview()
                    print("this value exist and should not present to card view")
                      else
                          print("this value does not exist")
                      
   
            
        , withCancel: nil)
    

如果用户之前刷过卡片,我希望卡片不显示。测试代码时我没有收到错误,但它没有执行。如果存在与当前卡匹配的快照,则应将其删除。

经过一番调查,我设法创建了下面的代码。这段代码有些工作,但不是我希望的方式。它仍然保存代码,当我刷新页面时,保存到 firebase 的卡片不显示,但它只显示虚拟卡片。

 func fetchUserSwipes() 
    let uid = Auth.auth().currentUser?.uid
    let ref = Database.database().reference(withPath: "userSwipesForCU")
    ref.child(uid!).observeSingleEvent(of: .value, with:  (snapshot) in
        if let userDictionary = snapshot.value as? [String: AnyObject] 
            let user = User(dictionary: userDictionary as [String : AnyObject])
            self.user = user
            
            let poster = Poster(dictionary: userDictionary as [String : AnyObject])
            let cardView = self.setupCardFromUser(poster: poster)

            if cardView == ref.child("fromId")
                cardView.removeFromSuperview()
                print("this value exist and should not present to card view")
                  else
                print("this value does not exist")
                    
                  

        
    , withCancel: nil)

【问题讨论】:

"它不执行" 你能澄清你的意思吗?例如,如果您在if let userDictionary = ... 上放置一个断点并在调试器中运行代码,它会到达该行吗?如果没有,如果您还附加了一个 cancel 处理程序会发生什么:firebase.google.com/docs/reference/swift/firebasedatabase/api/…: that 会被调用吗? @FrankvanPuffelen 谢谢你的建议!添加 withCancel 确实有帮助,现在调用了该函数。我可以在控制台中看到这一点。现在我的主要问题是,卡片仍然出现。我是否必须检查卡的 id 是否等于保存在 firebase 中的 id 然后删除卡? @FrankvanPuffelen 我按照我上面所说的做了,效果有点好,但并不完全符合我的要求。我更新了我的代码以显示我尝试过的内容。 【参考方案1】:

尝试使用一次获取数据的方法 官方 Firebase 文档:https://firebase.google.com/docs/database/ios/read-and-write#read_data_once

    let uid = Auth.auth().currentUser?.uid
Database.database().reference().child("userSwipesForCU").child(uid!).observeSingleEvent(of: .value, with:  (snapshot) in

              if let userDictionary = snapshot.value as? [String: AnyObject] 
            let user = User(dictionary: userDictionary as [String : AnyObject])
            self.user = user
            
            let poster = Poster(dictionary: userDictionary as [String : AnyObject])
            let cardView = self.setupCardFromUser(poster: poster)
            

            if snapshot.exists()
                cardView.removeFromSuperview()
                print("this value exist and should not present to card view")
                  else
                      print("this value does not exist")
                  

【讨论】:

这确实有点帮助,但我仍然面临一个问题。它将卡片保留在那里,但它使它们变为空白而不是完全删除它们。 您好,请添加一些示例代码进行说明,并粘贴到相关文档中以防止链接腐烂。

以上是关于从 firebase 检测值并从 superView 中删除(如果为真)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用使用 firebase 创建的登录模块进行注册,并从客户端收到错误“TypeError: Cannot read property 'email' of null”

如果用户从 IdentityServer4 中的另一个浏览器/设备登录,如何检测并从应用程序中注销用户?

从 Firebase 检测带有 UUID 的 iBeacons

删除 tableView 单元格并从 firebase 中删除数据

从 Firebase 存储中获取图片

在 UITableView 上加载数据向上滚动