如何在不重新加载控制器的情况下更新用户在线状态?

时间:2018-10-04 14:18:55

标签: swift firebase-realtime-database google-cloud-firestore user-presence

因此,我制作了一个工作正常的聊天应用程序,其中后端是Firestore(我知道那里有Firebase。),我还有一个文档,其中用户在线离线状态为“记录器”。

当用户登录“ isOnline”节点时,将值更改为true或“ online”,当应用程序进入后台时,该值更改为“ offline”。

唯一的问题是我必须重新加载viewController才能进行更改。有什么办法可以实时更新用户状态

AppDelegate:-

在ApplicationDidBecomeActive

 if User.currentUser() != nil {
                updateCurrentUserInFirestore(withValues: [kISONLINE : "online"]) { (success) in
                }
            }

在ApplicationDidEnterBackground

if User.currentUser() != nil {
            updateCurrentUserInFirestore(withValues: [kISONLINE : "offline"]) { (success) in

            }
        }

比在chatViewController中导航栏的设置如下

userstatus func
     if withUser.isOnline == "online" {
                navigationController?.navigationBar.barTintColor = UIColor.flatGreen()
            }else{
               navigationController?.navigationBar.barTintColor = UIColor.flatBlue()
            }

以下是检查状态变化的功能

 func updateUserOnlineStatus() {

        if !isGroup! {
            var withUser = withUsers.first!


            withUserUpdateListener = reference(.User).document(withUser.isOnline).addSnapshotListener { (snapshot, error) in
                guard let snapshot = snapshot else {  return }
                if snapshot.exists {
                    print(snapshot)
                   let withUser = User(_dictionary: snapshot.data()! as NSDictionary)
                   self.setUIForSingleChat(withUser: withUser)
                }
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

这可以解决问题,旧代码中存在一些问题

func updateUserOnlineStatus() {
    print("User update online status")
    if !isGroup! {
        var withUser = withUsers.first!
        withUserUpdateListener = reference(.User).document(withUser.objectId).addSnapshotListener { (snapshot, error) in
            if error != nil {
               print("error")
            }
            print("update user status")
            let withUser = FUser(_dictionary: snapshot!.data()! as NSDictionary)
            if withUser.isOnline == "online" {
                self.navigationController?.navigationBar.barTintColor = UIColor.flatGreen()
            }else{
               self.navigationController?.navigationBar.barTintColor = UIColor.flatBlue()
            }


            }

        }

    }