2017-10-19 73 views
0

在我的iOS应用程序中,我使用firebase observeEventType:FIRDataEventTypeChildChanged来获取特定节点的实时更新。但是,当用户进入离线节点更新几次。但是,当用户来到在线用户无法获得以前的更新。有没有解决方案?FIRDataEventTypeChildChanged不能用于脱机?

回答

3

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,可以保证它看到发生的所有变化。

+0

是的。但是,当用户脱机时,它已经添加了几个新的子节点。然后用户重新连接,不会接收'observeEventType:FIRDataEventTypeChildChanged'的更改。但更改接收“FIRDataEventTypeValue”和“FIRDataEventTypeChildAdded”,重新连接后不会发生任何更改。 – isuru