TheDistanceComponents 0.7.2

TheDistanceComponents 0.7.2

测试已测试
语言语言 SwiftSwift
许可 MIT
发布上次发布2017年4月
SwiftSwift 版本3.0
SPM支持 Swift Package Manager

Vlad AlexaJames ShawAnh TranBen Baggley 维护。



  • The Distance

TheDistanceComponents

构建出色的 iOS 应用的构建模块

动机

该项目有两个关键目标:

  1. 提高代码的可重用性,以减少样板代码和开发时间,同时增加稳定性和一致性。
  2. 提高代码的可测试性,同时减少需要编写和维护的样板测试代码。

为了实现这些目标,我们创建了默认功能的基实现,称为“组件”,这些组件可以在多个应用程序中重用和定制。如下所述,在代码中详细说明了“模型-视图-视图模型”(MVVM)架构和 ReactiveCocoa,我们认为这是最佳选择,因为它比 MVC 更灵活、更可测试,比 Viper 更简洁、更透明。

该项目通常包含很少的 UIViewController,着重于创建可重用的视图模型组件。使用 AsyncDisplayKit 创建可重用的 UI,这是一个用于创建 UI 的优秀库,并将使用 ASDisplayNode 来提供可定制的 UI 构建块。

组件

为了减少使用 TheDistanceComponents 的项目的依赖关系,每一项功能都已被分离到它自己的框架中。

  • TDCAppDependencies:
    • 用于实现标准化 MVVM 架构的单例和相关类
    • 标准分析 & 崩溃报告接口的协议
    • 标准视图加载协议

  • TDCContentLoading:
    • 处理 MVVM 中网络请求的标准 StateModel & ViewModel
    • 使用 ReactiveCocoa 提供的视图生命周期属性
    • 包括分页内容的列表加载标准案例

查看各个部分以获取更多详细信息。

安装

按照 Carthage 安装说明操作。添加您将使用的框架及其依赖项,然后检查每个框架的文档以开始。

由于ReactiveCocoa没有官方的CocoaPods支持,因此CocoaPods也不支持TheDistanceComponents。

MVVM & Components: 简要介绍

模型

在应用中表示数据的任何东西都可以被视为模型对象。这些可能是简单的Swift结构体或者是 NSManagedObject。我们将尽力不在Components中定义模型对象。如果必要的话,将使用协议,以便应用程序可以定义尽可能少受限制的自己的模型。

视图

应用中每个视图都分为视图和ViewModel两部分。ViewModel负责所有逻辑,而视图则负责根据从ViewModel接收到的Model对象更新屏幕上显示的内容。这允许责任彻底分离并增加了测试性,而不会不必要地增加复杂度。视图可以是UIView的子类或者是ASDisplayNode。鉴于额外的性能和灵活性,我们将使用ASDisplayNode来定义默认视图组件。

为了将视图生命周期事件传递给“ViewModel”对象,应该将ReactiveAppearanceViewControllerUIViewController派生出来。这提供了一个包含有ViewLifetime事件信号的信号,可以在ViewModel上的MutableProperty<ViewLifetime>上进行绑定。

视图应由AppDependencies单例中的ViewLoader创建,如TDCAppDependencies中定义。这允许开发可以提供默认行为框架,应用程序可以通过依赖注入进行专业化。Components提供了一些标准UI,使用AsyncDisplayKit,其中通过编程创建子类UIViewController,与使用Storyboards相比,提供了更大的自定义灵活性。如果您使用Storyboards来加载视图,建议使用来自TheDistanceCoreStoryboardLoader协议。

可以使用包含多个ViewModel对象的UIViewController构建复杂视图。

ViewModels

ViewModel执行逻辑。它们使用ReactiveCocoa信号来表明其输入和输出,无需指定参数(如果使用基于闭包的语法,则典型于MVC架构)。它比Viper架构更简洁、更透明。

对于提供异步内容的ViewModels,应从TDCContentLoading中的ContentLoadingViewModel派生。这设置了观察ViewLifetime事件和发送加载和错误事件的信号。所有这些都被包装在方便的方式中。内容可以通过重写loadingProducerWithInput(_:)方法异步加载。对于使用ReactiveCocoa的联网请求,我们强烈推荐使用ReactiveCocoaConvenience

可测试性

在模块化方面,ViewModels 提供了易于测试的特性。使用 XCTestCase 类,可以将信号的结果绑定到属性上,并以替代用户界面交互的方式发送信号输入。异步测试可以通过使用 Nimble 框架简单地实现。我们将努力对所有功能部件进行测试。

组件 ViewModel 测试不应查询网络(尽管验证服务器响应的应用测试可能有益)。相反,预期的响应可以保存到本地的 json 文件中。《TDCContentLoading》提供了如何模拟 API 对 ViewModel 的响应的详细信息。

UIViewController 通常通过将 UI 信号绑定到 ViewModel 信号来与 ViewModel 进行通信。如果您的 UIViewController 子类使用依赖注入,您可以在 Xcode 中创建 UI 测试目标,将 ViewModel 注入到 UIViewController 中,使其立即返回静态内容。这将允许您测试应用中的用户体验。

模块化

TDCAppDependencies 提供一致的单例结构和依赖注入。

进一步阅读

以上是 MVVM 框架关键点的简要概述。每个部分都有其深入阅读的 ReadMe 和文档。有关这里讨论的主题的更多信息,您可以尝试以下内容:

交流

如果您有任何疑问/建议,我们将非常乐意听到您的意见。

  • 如果您发现了 错误,请提交一个 issue。
  • 如果您有 功能请求,请提交一个 issue。
  • 如果您想 做出贡献,提交一个 pull request。
  • 如果您想 提出一个一般性问题,请通过电子邮件联系我们。