Ios Firebase是否始终保证按顺序添加事件?

Ios Firebase是否始终保证按顺序添加事件?,ios,firebase,firebase-realtime-database,Ios,Firebase,Firebase Realtime Database,我正在开发基于Firebase实时数据库的messenger IOS应用程序。 我希望所有消息都是基于时间戳排序的 有一个场景如下所示。 有3个客户。A、 B和C (一) 所有客户端注册“figure-1”侦听器以接收来自其他客户端的消息 <figure-1> ref.queryOrdered(byChild: "timestamp").queryStarting(atValue: startTime).observe(.childAdded, with: { ....

我正在开发基于Firebase实时数据库的messenger IOS应用程序。 我希望所有消息都是基于时间戳排序的

有一个场景如下所示。 有3个客户。A、 B和C

(一)

所有客户端注册“figure-1”侦听器以接收来自其他客户端的消息

<figure-1>

ref.queryOrdered(byChild: "timestamp").queryStarting(atValue: startTime).observe(.childAdded, with:
{
    ....
    // do work for the messages, print, save to storage, etc.
    ....

    // save startTime to storage for next open.     
    startTime = max(timeOfSnapshot, startTime)
    saveToStorage(startTime)
}
他们在同一时刻发出了信息

所有客户都有高速wifi

所以,最后。保存的服务器数据如“图2”

<figure-2>

text : "Message 1",  timestamp : 100000001
text : "Message 2",  timestamp : 100000002
text : "Message 3",  timestamp : 100000003
如果不能保证,我的策略是绝对错误的

例如,一些客户端接收到如下消息

Message 3  // the highest timestamp.

// app crash or out of storage

Message 1
Message 2
客户端不再有机会获得消息1、2

我认为如果已经有一些节点,Firebase可能会触发这些节点。因为,这是“queryOrdered”功能的角色

但是,在注册侦听器之前没有节点,然后再添加新节点。会发生什么

我想Firebase可能会向客户端发送3个数据包。(无论消息到达的速度有多快,Firebase都必须在消息到达后立即发送。)

最终,所有数据都是一致的。但秩序被破坏了

Firebase是否保证事件按顺序发生

我搜索了stack overflow和google,并多次阅读了官方文件。但是,我找不到明确的答案


我差不多为此花了一个星期。请给我一条建议。

查询数据的返回顺序是一致的,由服务器决定。因此,所有客户机都保证以相同的顺序获得结果


对于附加侦听器后发送到数据库的新数据,所有远程客户端将以相同的顺序接收它。然而,在数据到达数据库服务器之前,本地客户端将立即看到其写操作的事件


在图2中,它实际上非常简单:因为每个节点都有一个唯一的时间戳,它们将按照该时间戳的顺序返回。但是,即使它们具有相同的时间戳,它们也会以相同的顺序(首先是时间戳,然后是键)返回给每个客户端。

还发布在“对于附加侦听器后发送到数据库的新数据,所有远程客户端都将以相同的顺序接收”上,这是否意味着所有客户端都将接收到有序数据(排序:消息1、2、3)?是否保证在“消息1”到达之前他们不会收到“消息2”?使用您显示的代码和JSON,消息确实会按照
Message 1 Message 2 Message 3
的顺序到达。
Message 1
Message 2
Message 3
Message 3  // the highest timestamp.

// app crash or out of storage

Message 1
Message 2
Packet1 for message1
Packet2 for message2
Packet3 for message3

ClientA fail to receive for packet 1,2 
ClientA success to receive for packet 3
Firebase re-send packet 1,2 again. 
ClientA success to receive for packet 1,2