保持数据一致性

在客户端开发中,常常出现在当前界面删除数据后,相关的界面需要同步的场景。虽然可以让用户手动刷新一次,但这样的体验毕竟不好,最好在删除数据后所有界面都能马上做出响应。500px 团队前不久发布了一篇博客,就围绕 Android 开发中的数据一致性展开了讨论。

为了保持数据一致性,一般有三种实现方式:

  1. 定义接口,实现了接口的 View 可以相互之间通信;
  2. 使用全局的事件总线;
  3. 使用「发布/订阅」系统。

定义并实现接口,虽然易于理解,并且将处理数据职责的相关 View 束缚在一定范围内(相对于全局而言),但却容易让代码臃肿、紧耦合。一个 View 只需要关心它自己的数据处理逻辑,对于其他 View 的状态其实是不关心也不应该关心的,接口这种方式让 View 多处理了本不该处理的事;并且在后续开发中,如果有新的 View 依赖加入,就要扩展之前的处理逻辑,很是麻烦。不建议采用。

全局的事件总线如 EventBus/RxBus/Otto 等,虽然让代码不太耦合了,但随着需要处理的事件越来越多,事件也会变得越来越难管理,如果你看看 Telegram 的消息中心实现,就知道多复杂了。

最后来说说「订阅/发布」系统。也许大家会觉得奇怪,为什么 EventBus 这类实现不能归类在这个系统里呢?宽泛来说确实应该属于,但是在这里我们要说的是基于数据改变的模式,而不是依靠自定义事件。某种程度上说类似于 MVVM ,相关 Model 改变了,对应的 View 也产生变化。目前看来这是保持数据唯一性最好的方式了。500px 团队内部开发了名为 Jackie 的中心化数据发布/订阅系统,在未来也有相关的开源计划。不过话说回来,如果是让你自己来实现这样一套系统,你会怎么做呢?

返回