【发布时间】:2017-10-19 21:30:01
【问题描述】:
在我的 iOS 应用程序中,我使用 firebase observeEventType:FIRDataEventTypeChildChanged 来获取特定节点的实时更新。但是,当用户离线时,节点会更新几次。但是当用户来到在线用户无法获得以前的更新。有解决办法吗?
【问题讨论】:
标签: ios objective-c firebase firebase-realtime-database
在我的 iOS 应用程序中,我使用 firebase observeEventType:FIRDataEventTypeChildChanged 来获取特定节点的实时更新。但是,当用户离线时,节点会更新几次。但是当用户来到在线用户无法获得以前的更新。有解决办法吗?
【问题讨论】:
标签: ios objective-c firebase firebase-realtime-database
Firebase 实时数据库同步状态。它确实(明确地)不同步所有中间状态更改。
如果在您的客户端离线时对同一节点进行了多次更改,它实际上只会看到最终状态。
Client1 Database Client2
Start listener
write 1 --> 1 --> 1
write 2 --> 2 --> 2
Go offline
write 3 --> 3
write 4 --> 4
Go online
--> 4
write 5 --> 5 --> 5
所以在上图中,客户端 2 只会看到值 1、2 和 5。它可能也看到值 4,具体取决于写入值 5 的时间。但它肯定不会看到值 3。
如果您希望在客户端 2 重新连接时将每个状态更改传达给它,您应该将确切的状态更改存储在您的数据库中。因此,您将存储操作,而不是存储结果值。比如:
Changes: {
"-PushId1": { value: 1 },
"-PushId2": { value: 2 },
"-PushId3": { value: 3 },
"-PushId4": { value: 4 },
"-PushId5": { value: 5 }
}
现在,如果您的客户收听/Changes,则可以保证看到发生的所有更改。
【讨论】:
observeEventType:FIRDataEventTypeChildChanged 的更改。但是FIRDataEventTypeValue 和FIRDataEventTypeChildAdded 的更改在重新连接后不会发生任何更改。