【问题标题】:Load new messages Swift 4.2 & Firebase加载新消息 Swift 4.2 和 Firebase
【发布时间】:2019-02-18 14:44:58
【问题描述】:

我已经为我的应用程序创建了一个消息系统,并正在对聊天日志中的消息进行分页,但是我遇到了一个问题,即如果发送了新消息,用户将不得不离开屏幕并重新打开控制器才能查看他们发送/接收的新消息。我试图重新加载集合视图并再次观察消息,但没有运气。任何帮助表示赞赏。

观察消息。使用分页。(效果很好!在初始加载时。)

var messages =  [Message]()
fileprivate func observeMessages() {

    guard let uid = Auth.auth().currentUser?.uid else { return }
    guard let userId = user?.uid else { return }

    if currentKey == nil {

        let userMessageRef = Database.database().reference().child("user-message").child(uid).child(userId).queryLimited(toLast: 10).observeSingleEvent(of: .value) { (snapshot) in

            guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
            guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

            allObjects.forEach({ (snapshot) in

                let messageId = snapshot.key

                let ref = Database.database().reference().child("messages").child(messageId)
                ref.observe(.value, with: { (snapshot) in

                    guard let dict = snapshot.value as? [String: Any] else { return }

                    let message = Message(dictionary: dict)

                    self.messages.append(message)
                    self.messages.sort(by: { (message1, message2) -> Bool in
                        return message1.timeStamp.compare(message2.timeStamp) == .orderedDescending
                    })
                    self.collectionView?.reloadData()
                })
            })

            self.currentKey = first.key
        }

    } else {

        let userMessageRef = Database.database().reference().child("user-message").child(uid).child(userId).queryOrderedByKey().queryEnding(atValue: self.currentKey).queryLimited(toLast: 4).observeSingleEvent(of: .value) { (snapshot) in

            guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
            guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

            allObjects.forEach({ (snapshot) in

                if snapshot.key != self.currentKey {

                    let messageId = snapshot.key

                    let ref = Database.database().reference().child("messages").child(messageId)
                    ref.observe(.value, with: { (snapshot) in
                        guard let dict = snapshot.value as? [String: Any] else { return }

                        let message = Message(dictionary: dict)

                        self.messages.append(message)
                        self.messages.sort(by: { (message1, message2) -> Bool in
                            return message1.timeStamp.compare(message2.timeStamp) == .orderedDescending
                        })
                        self.collectionView?.reloadData()
                    })
                }
            })
            self.currentKey = first.key

        }
    }
}

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    From Firebase database documentation

    在某些情况下,您可能希望调用一次回调然后立即删除,例如在初始化您不希望更改的 UI 元素时。可以使用observeSingleEventOfType方法来简化这个场景:事件回调添加触发一次后不再触发。

    我建议你改成observeEventType:withBlock,这样你就可以观察到所有的变化事件。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我的设置方式是在 viewDidLoad 中调用该函数,然后在 viewDidAppear 中再次调用。我也在学习,但你可能想尝试一下,它可能看起来像这样:

      override func viewDidLoad() {
          super.viewDidLoad()
      
          observeMessages(for: userID) { (messages) in
              self.messages = messages
              self.collectionView.reloadData()
          }
      }
      

      再次在 viewDidAppear 中:

      override func viewDidAppear(_ animated: Bool) {
          super.viewDidAppear(animated)
      
          observeMessages(for: userID) { (messages) in
              self.messages = messages
              self.collectionView.reloadData()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 2022-06-16
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多