每当用户打开聊天时,我都会尝试添加用户在线状态。
public static func getFirebaseOnlineStatus(userRef: String) -> FIRDatabaseReference{
return FIRDatabase.database().reference()
.child("meta")
.child(userRef)
.child("last_seen")
}
在ChatVC中
private func userIsOnline() {
// Firebase make this user online
firebaseLastSeen = Constants.getFirebaseOnlineStatus(SMBUser.getCurrentUser().getId())
firebaseLastSeen.setValue("Online")
}
private func observerUserOnline(){
firebaseLastSeen.observeEventType(.Value, withBlock: { snapshot in
print(snapshot.value)
self.userIsOnline()
}, withCancelBlock: { error in
print(error.description)
})
}
这个逻辑对我来说似乎非常糟糕,因为每次值发生变化时,我都会再次将值更改为Online
,因为如果删除observerUserOnline()
,则值会更新为Online
last_seen
但{2}后,即使用户在该聊天中在线,也会更改为time(unix format)
。
有没有更好的方法来解决这个问题?
答案 0 :(得分:3)
您可以使用发布 - 订阅模式。让我们理解什么是发布 - 订阅模式。
publish-subscribe是一种消息传递模式,其中包含消息的发送者, 被称为发布者,不要对要直接发送的消息进行编程 特定的接收器,称为订户,而是表征 将消息发布到类中而不知道哪些消息 订阅者,如果有的话,可能会有。同样,订阅者表达 对一个或多个类感兴趣,只接收有关的消息 兴趣,不了解哪些出版商(如果有的话)。
来源:Wikipedia
以下是使用RabbitMQ MQTT Adapter的示例:
将用户A的应用程序订阅到主题“/ topic / user-a”,将用户B的应用程序订阅到主题“/ topic / user-b”,并将在线/离线状态发布到主题" / topic /存在&#34 ;. 在后端服务器上创建一个程序以订阅" / topic / presence"。如果有任何更新来自用户A然后将更新发布给用户A的所有朋友。这样,用户B将收到用户A的在线/离线更新。
User A User B PresenceListener
Subscribe /topic/user-a /topic/presence /topic/presence
Publish /topic/user-b /topic/presence friend list
这里的真正挑战是如何发布"离线"。一个案例是,如果用户在互联网仍处于活动状态时关闭应用程序,则应用程序可以发布"离线"服务器的状态,但当互联网停止工作时会发生什么?
让我们通过"遗嘱和遗嘱#34; (LWT)。
LWT messages are not really concerned about detecting whether a client has gone offline or not (that task is handled by keepAlive messages). LWT messages are about what happens after the client has gone offline.
可以利用LWT消息来定义代理代表客户发布的消息,因为客户端处于脱机状态且无法再发布。
来源:http://tuanpm.net/what-is-mqtt/
对于在状态服务上使用类似内容的示例源代码,您可以查看Github中提供的Applozic Chat SDK代码https://github.com/AppLozic/Applozic-Android-SDK