Tag: 中间件

重新练习

关于将Redux-Style应用程序体系结构用于iOS应用程序存在一些嗡嗡声。 该模式绝对值得仔细研究,并具有一些巨大的优势,但是在实践中效果如何? 关于ReSwift的许多介绍已经在那里,但是,我还没有看到有关如何在实际的可交付应用程序中应用ReSwift的出色示例。 在本文中,我试图演示如何使用ReSwift构建几乎“真实世界”的应用程序,同时使所有内容都可测试并与系统API和网络服务很好地集成。 如前所述,已经有大量的信息介绍ReSwift了,我正在努力使其简短。 单向数据流意味着没有将您的应用程序状态保存在许多不同的地方。 取而代之的是,存储组件将所有状态保持在中央位置。 视图对这种状态的更改做出反应,而不是在内部进行处理。 动作是触发状态更改的唯一方法。 动作不会自行执行状态更改,而是将它们更像是表示某些内容将发生更改的消息。。这些“消息”是针对使用执行实际状态更改的Reducer的Store对象发出的。 还有中间件来处理副作用,稍后将介绍。 这种方法有一些很大的好处: 业务逻辑与UI保持独立 减速器具有纯功能-非常适合测试 视图内的简单逻辑-只需对状态更改做出反应并将操作发送到存储 可以在多个视图(或其他组件)之间轻松共享状态 与标准MVC相比,总体而言,方法更加清洁 有一个反例以非常基本的形式展示了上述架构。 在该示例中,一切看起来都很干净,但是通常的应用程序开发要复杂得多。 操作系统或第三方框架提供的异步操作(例如,网络连接)和功能需要集成。 本文的其余部分介绍了如何设置一个经过全面测试(UI除外)的示例应用程序,该应用程序集成了CoreLocation和Google的网络服务,该服务需要用户的位置。 以下是要求的简短列表: 处理位置权限并对其进行更改。 获取用户位置并更新用户移动。 接收到用户的位置后,在附近显示餐馆。 您可以在GitHub上查看所有源代码。 对于每一步骤,至少有一个提交。 每个步骤都将提供指向相应源代码的链接。 项目设置 作为起点,已经存在一个将ReSwift作为依赖项的Xcode项目。 此外,围绕Google Places API的简单网络抽象以及用于检索地点(更好的餐厅)信息的相应模型类已经在那里。 显示餐厅的第一步是设置所需的ReSwift对象:Store,Reducer和State。 中间件的定义如下: 更新操作 -如您在上图中所看到的,现在需要两个操作来获取和设置位置。 (此处设置表示更新状态。) 与以前不同,不需要执行任何副作用,因此不需要中间件。 而是需要一个Location Observer器。 在外部,它的行为几乎类似于某些UI组件,但是它不是根据用户输入发送动作,而是在状态发生特定变化时发送动作。 LocationObserver的重要部分。 仅局部观察该状态,并在newState上调度提取位置操作。 上面的代码段显示了观察位置变化的实现。 同样,这里省略了集成和测试。 您可以在此处看到完整的实现:65bef0d 这样就完成了示例应用程序的工作。 您应该能够构建和运行该应用程序。 授予位置权限后,您应该可以看到周围的餐厅,而移动餐厅时,这些餐厅应会自动更新。 在本文中,我比其他大多数文章更深入地介绍了用ReSwift编写应用程序的细节。 在处理副作用时,我展示了中间件的大量使用。 这有点违背提供的示例项目(例如GitHubBrowserExample),但将动作和网络逻辑分开,并提高了可测试性。 好消息是ReSwift足够灵活,可以调整应用程序体系结构以满足您的需求。 另一方面,我对标准模式没有将副作用与行动分开并且没有提供良好的策略测试感到非常不满意。 […]