使用Reactor建立乐观的网络

一个爱情故事

上次我们讨论了一些很酷的东西,我们可以使用Reactor架构来构建更具反应性的iOS应用程序。 今天,我们将研究如何与网络中的数据保持同步,并通过乐观的力量使我们的应用程序更快

让我们看一下Reactor架构图以快速复习:

我们发送事件以使Reactor更新我们的应用程序状态。 反应器处理事件,更新状态,然后通知所有订户。 但是异步事件呢?

指令

在您的应用中,执行异步事件可能很常见。 Reactor提供了Command API,以帮助建立一致且安全的方式来执行异步事件

希望内部执行的代码看起来与您通常的网络功能相似。 此处的区别是我们将其包装在一个函数内部,该函数接收其自己的应用程序状态副本和对Reactor的引用。 我们在这里最终不需要任何状态,但是我们使用Reactor引用在网络任务完成时调度事件。

即时,乐观的网络结果

假设我们正在执行不同类型的网络请求,也许正在添加一个新播放器。 我们是否真的要等待服务器的响应才能更新UI? 您能想象喜欢在Facebook上发帖并等待请求一直到Facebook并返回以确认我们的喜欢已被成功记录,然后看到拇指变蓝吗? 没人会为此腾出时间! 我们希望我们的应用程序快速响应!

如果我们仅假设网络请求成功并立即更新UI,该怎么办? 然后,我们可以稍后再更新实际响应。 或者,如果发生错误,我们可以重置为原始状态。 我们称其为“乐观网络”。

这段代码类似于FetchPlayers命令,但是我们在结构中添加了属性-这使我们能够为异步命令设置必要的数据。 我们还在其他几个地方触发事件:

  1. 我们乐观地将新玩家添加到我们的州,并触发一个事件,通知反应堆使用我们的乐观者列表更新其当前玩家列表。
  2. 成功请求后,我们解析响应并更新(第二次)服务器返回的结果。 如果数据相同(如果我们的乐观是正确的话),那么我们应该不会有任何区别。
  3. 如果我们的请求返回错误,则将列表重置为开始时的位置,并向用户显示错误消息。

结论

如果您正在使用Reactor并执行任何异步操作,那么您想使用Commands!

命令将帮助您以一致的方式处理异步任务,同时利用Reactor的功能使UI始终保持同步。 而且,几乎无需进行任何工作,您就可以拥有乐观的力量,使您的应用程序感觉更快。