数据从服务器第一次同步
1.app首次打开并登录之后,需要拉取所有相关数据,包括所有文件信息、所有notebook信息,所有annotations信息(第一次打开同步数据过程较慢长)
image.png
2.建立socket连接,app打开并同步完之后,需要和服务器建立长链接,监听相关改变
image.png
文件相关变动的同步
1、文件新增
当某一个teacher新上传了新文件的时候,服务器需要给有相关权限的user发送通知(通过socket发送),
如图,如果teacher A上传了新文件,而且分享给了teacher B,则这时候,服务器要通过socket把新增文件的详细信息推送给所有的Admin用户以及teacher B(此时建议服务端可以采用类似建立group的机制,就是有相关文件权限的人,backend创建一个socket group,类似群聊),如果此时teacher B 或admin A 不在线,则服务器应将此条消息存入offline_message 表,当用户teacher B 重新连线之后,首先会查询服务器是否有遗漏的消息,此时服务器可通过一个query查询将发送失败的消息返回给teacher B。teacher B拿到消息之后,需要展示“teacher A 新上传了一个新文件,点击查看或点击刷新列表“,更新teacher B 本地ipad数据库(此举确保本地数据库数据和远端数据库数据一致),此时服务端应该删除offline_message 相关的记录。
2.文件删除
文件删除流程基本等同于文件新增流程
3.文件权限变更,
如果teacher A 删除了对teacherB的相关权限,则服务端也要发送相关的消息给teacher B以及admin 们,类似群聊的时候teacher B被 A剔除。
annotations相关变动的同步
1.annotations 新增(类似file新增)-------给有此notebook权限的所有用户发消息。
2.annotations 删除(类似files删除)-------给有此notebook权限的所有用户发删除消息。
3.annotations变更,服务器给所有有权限用户发送相关变更内容。
完全实现离线
如果以上步骤完全实现,则ipad端本地数据库基本可以保持和远端数据库完全一致,则如果用户离线状态下,完全可以使用ipad本地数据库。
1.展示
如果用户当前离线,展示的数据完全来源于本地数据库。所有的文件、notebook、annotations。
2.离线状态下操作file
目前木有离线状态下操作file的需求,所以,此条目前可以忽略。
3.离线状态下操作annotations
离线状态用户操作annotaitons,app将把所有用户操作存在一个本地数据库表里面,当网络恢复之后,app用户首先查询所有服务器其他用户在这期间的所有变更内容,之后判断自己修改的内容是否和服务端有冲突,如果没有,则直接同步到服务端,如果有冲突,则让用户选择,需要保存的内容。
综上:数据完全存在本地数据库,app不会消耗大内存,可保持流畅性。以上流程完全可以保证本地数据和远端数据库实时同步,而通过socket方式,使数据同步更实时,而且app不会频繁query服务器所有数据,所以也不会带来任何性能问题,本地数据库能保持实时性,这样实现完全离线的目标,就水到渠成了。
网友评论