我有一个应用程序,用户可以在其中签到不同的地方(就像facebook的签到功能)。签到既可以是公开的(在这种情况下,x英里范围内的任何应用程序用户都可以看到该签到),也可以是私人的(只有该用户的朋友可以看到它)。
我需要在应用程序中实现socket,以便每当用户签入或签出时,其他人的地图视图(根据设置,它可以是公共的或私有的)自动更新。
处理这种情况的最佳策略是什么?我在想,会为每个签到用户创建一个新房间,他的朋友也会加入进来。或者,我会保存每个登录用户的socketId,并在签入发生时向用户子集发出一个事件(比如通知)
发布于 2020-02-11 08:05:50
让我回顾一下我认为你所说的是流程:
无论是公共签入还是私有签入/签出,逻辑都是相同的。私人签到的唯一不同之处在于,您只分析朋友的位置来决定通知谁,而不是分析每个人。
因此,如果这就是整个流程,似乎您通常只需要找出谁在检入/检出位置附近(在特定距离内)的能力,以便您可以通知他们检入或检出事件。
因此,对于步骤2,您需要预先存储想要参与此流程的所有用户的地理位置。然后,您需要能够有效地遍历整个列表,并找出谁可能在新签到的目标距离内。虽然您可以计算每个用户的绝对距离,但首先检查纬度或经度差异是否大于某个阈值可能更有效,因为这将意味着不需要更复杂的数学来排除它们。这将使您只有一部分用户可以执行完全匹配,以查看他们是否足够接近。如果您的用户列表按诸如经度值之类的内容进行排序,那么查找用于比较实际距离的子集将会更快。
一旦找到一组在目标距离内的用户,您就向这组用户发送socket.io通知,通知新的签到。当这些客户端接收到该消息时,它们会相应地更新它们的地图,并执行任何用户通知。您可以保存您在socket.io房间中通知的这组用户,但我不认为这真的是必要的(请参阅以下步骤)。
对于第4步,用户将检出某个位置。你基本上可以重复第二步的过程。找出谁还在附近,并向他们发送一条结账消息,他们会相应地更新他们的地图。如果您已经保存了房间中的所有用户,您可以只将此结帐广播到房间,但当用户自签入通知(见下文)以来移动时会产生一些问题,并且您似乎可以使用之前在步骤2中使用的相同逻辑来计算步骤4中要通知的用户。
在中签入其他用户时,用户正在移动
如果UserB (收到用户A签入的通知)决定在UserA签出之前搬家,您将需要使用用户B的新位置更新服务器,并让UserB更新自己的地图。当他们更新他们的地图时,他们可以从地图中删除现在离他们的新位置太远的任何签到(他们将该信息保存在本地,并只查看谁现在离他们太远)。当他们通知服务器他们的新位置时,服务器随后对他们的新位置重复步骤2,并根据他们的新位置通知他们现在与他们足够接近的任何用户。
如果您使用聊天室来存储UserA签入的原始用户列表,则每次该聊天室中的某人更改其位置时,您都必须不断更新该聊天室。因为每次有人搬家都可能有很多房间要更新,所以每次有人搬家似乎都要进行大量的维护计算,而你可以做到,只要重新计算谁在附近就行了,而且你已经需要提高计算效率,因为它会被大量使用。
所以,不管怎样,这些都是我的想法。希望能对你有所帮助。
https://stackoverflow.com/questions/60157483
复制相似问题