离线优先
哪里都能用。
即使没有WiFi。
Bobby将所有数据存储在你的设备本地。打开应用任务即刻呈现——没有加载、没有转圈、没有"请检查网络连接"的错误。恢复网络后变更自动同步。
你的任务存在你的设备上
大多数任务应用像网站一样工作——每次打开都从服务器加载数据。如果服务器慢了或连接断了,你看到的是转圈、空白屏幕或错误提示。Bobby采用了完全不同的方式。
Bobby采用离线优先架构。每个任务、每条备忘、每条完成记录、每个列表——全部存储在手机上的本地数据库中。打开Bobby时直接读取本地数据库。查看任务无需任何网络请求。应用打开数据就在,即刻呈现,每次都是。
这意味着Bobby很快。不是"对于移动应用来说很快"——是真正的即刻响应。点击图标任务列表就出现。没有加载状态。没有骨架屏。没有"下拉刷新"。你的数据一直在那里,因为它从未离开你的设备。网络只用于同步,不用于读取。
无缝同步
恢复在线后变更自动同步
离线时做了改动?Bobby将它们保存在本地队列中,网络恢复的那一刻全部同步。零数据丢失。零操作。
你做出改动
完成任务、创建新任务、勾选备忘、编辑标题。每个操作立即写入设备上的本地数据库。应用即刻响应——无需"等待服务器"。
Bobby将变更排队
如果你在离线状态,每个改动都进入上传队列。Bobby追踪所有需要同步的内容并保持顺序。你可以做任意多的改动——它们都会可靠地排队。
自动同步
网络恢复后,Bobby将排队的变更发送到服务器,并拉取其他设备或共享列表成员的更新。这一切在后台静默完成——不需要按任何按钮,不需要任何操作。
共享列表在所有人之间保持同步
当多人共享同一个列表时,离线优先变得更有意思。两个家庭成员同时离线完成任务会怎样?一个人编辑任务而另一个人完成它呢?Bobby优雅地处理所有这些场景。
Bobby使用实时同步引擎自动检测和解决冲突。每个变更都带有时间戳,服务器使用智能规则来决定两个变更冲突时哪个版本胜出。实际上冲突很少发生,因为Bobby对不同类型的字段使用独立的时间戳——任务参数和完成日期等计算字段是独立解决的。
结果是共享列表在所有成员间始终收敛到相同状态。你的伴侣在你坐地铁没信号时完成了"洗碗"——你重新联网后它立即在你的屏幕上更新。没有重复、没有丢失的完成记录、没有混乱。共享列表的每个成员看到的是相同的任务、相同的状态和相同的截止日期。
真实生活,真实场景
Bobby就是好用。随时随地。
大多数任务应用在断网时就不好使了。Bobby从第一天起就为无网络环境而设计。以下是最能体现差别的场景。
地铁隧道
站间没信号?Bobby仍然显示你完整的任务列表。通勤时勾选早晨的购物备忘——到地面后自动同步。
飞行模式
长途飞行?规划你的一周,整理任务,勾选打包清单上的项目。所有操作本地保存,降落后同步。
偏远地区
住在网络不稳定的地方?Bobby不在乎。你的任务始终可用,始终包含最新的本地变更。
不稳定的WiFi
在WiFi很差的咖啡厅?在有信号死角的建筑里?Bobby从本地存储读取,连接质量完全不影响应用体验。
野营
周末远离网络?Bobby继续工作。查看露营准备清单,完成每日任务,回到信号范围后一切同步。
超市地下层
超市地下没信号?你的购物清单还在Bobby里。边拿边勾选——无需网络。
从底层就与众不同
Bobby不是一个事后加上离线缓存的云应用。整个架构从第一天起就是离线优先设计的。以下是它在实践中的含义。
所有数据存储在设备上的本地SQLite数据库中。每个读取操作——查看任务列表、打开共享列表、查看排行榜——都直接读取本地数据库。你和你的数据之间从来没有网络调用。这就是为什么Bobby感觉是即刻的,不管你的连接质量如何。
写入也是本地优先的。当你完成一个任务时,变更立即写入本地SQLite。如果你在线,它实时同步到服务器。如果离线,它进入队列稍后同步。无论哪种方式,应用对你的操作即刻响应——在显示结果之前绝不需要服务器往返。
同步层使用实时复制协议,在服务器和所有连接设备之间传输变更。当服务器上的数据发生变化——比如另一个家庭成员完成了一个任务——更新会被推送到你的设备并自动合并到本地数据库。这与服务数百万需要可靠实时协作的用户的应用使用的是相同的技术,现在驱动着你家的家务清单。
Bobby vs. 传统任务应用
大多数任务应用是云优先的——它们依赖服务器连接才能运行。Bobby颠覆了这个模式。