让我们谈谈我们在使用这种特定的 MVI 方法时遇到的问题。 (我们有没有提到,这是一段漫长的旅程?) 我们的 MVI 实施存在问题 我们的 MVI 实现极大地改善了我们的情况(关注点分离、UI 无关代码、单一发出状态等),但是,由于“动作处理器”的实现方式,它引入了一个大问题:并发状态访问。 这种方法的问题在于actionProcessors、 、Observables、 是同时和并行运行的。
这引入了状态读取、处理和写入的大量问题。 我们从 MVI 实现中隐操作处理(当同时只处理一个操作时)和一致的数据模型: 不幸的是,事实并非如此——我们经历了惨痛的教训才明白这一点。我们的 MVI 实现更像是这样工作的: 我们的 MVI 未按预期工作有多种原因: 缺乏同步 多个处理器同时处理事件 即使在同一处理器内,事件也是异步处理的(由于频繁使用flatMaps) 结果的发出和处理没有任何顺序限制 状态访问不正确 我们的处理器需要能够访问和修改 巴拉圭手机号码列表 状态才能正确处理操作。
这通常会导致状态在处理开始时被读取并在处理结束时被覆盖 - 如果同时处理多个事件,则会导致大量竞争条件。 当事件偶尔发送并且在发送新事件之前足够快地处理时,我们的 MVI 实现效果很好。然而,随着我们增加发送事件的频率和增加处理时间,各种竞争条件和数据不一致开始出现。 解决方确定了当前实施的所有缺点后,我们对新实施提出了一组新的要求: 单向数据流:输入动作,输出状态 - 我们知道这是一个很好的假设并希望坚持下去。
|