Как я могу обновить онлайн-статус пользователя без перезагрузки контроллера?

Итак, я сделал работающее приложение для чата, в котором серверной частью является Firestore (я знаю, что там есть firebase). У меня также есть документ, в котором статус пользователей в автономном режиме является рекордером.

Когда пользователь входит в систему, узел «isOnline» изменяет значение на «истина» или «онлайн», а когда приложение переходит в фоновый режим, значение меняется на «офлайн».

Единственная проблема в том, что мне нужно перезагрузить viewController, чтобы изменения вступили в силу. Есть ли способ обновить статус пользователей в режиме реального времени?

Делегат приложения: -

в 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)
                }
            }

        }
    }

person shree bhagwat    schedule 04.10.2018    source источник
comment
Ну, вы могли бы создать некоторый наблюдаемый класс, который информирует наблюдаемые объекты об изменениях состояния. Затем в своем viewController вы добавите себя в качестве наблюдателя и получите уведомление, когда пользователь войдет в систему или выйдет из нее. В качестве альтернативы вы можете использовать NSNotification и NSNotificationCenter, чтобы уведомить свой viewController о каких-либо изменениях.   -  person Sander Saelmans    schedule 04.10.2018


Ответы (1)


Это сработало, в старом коде была проблема

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()
            }


            }

        }

    }
person shree bhagwat    schedule 04.10.2018