测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可 | MIT |
发布上次发布 | 2017年4月 |
SwiftSwift 版本 | 3.0 |
SPM支持 Swift Package Manager | ✗ |
由 Vlad Alexa、James Shaw、Anh Tran、Ben Baggley 维护。
构建出色的 iOS 应用的构建模块
该项目有两个关键目标:
为了实现这些目标,我们创建了默认功能的基实现,称为“组件”,这些组件可以在多个应用程序中重用和定制。如下所述,在代码中详细说明了“模型-视图-视图模型”(MVVM)架构和 ReactiveCocoa,我们认为这是最佳选择,因为它比 MVC 更灵活、更可测试,比 Viper 更简洁、更透明。
该项目通常包含很少的 UIViewController
,着重于创建可重用的视图模型组件。使用 AsyncDisplayKit 创建可重用的 UI,这是一个用于创建 UI 的优秀库,并将使用 ASDisplayNode
来提供可定制的 UI 构建块。
为了减少使用 TheDistanceComponents 的项目的依赖关系,每一项功能都已被分离到它自己的框架中。
查看各个部分以获取更多详细信息。
按照 Carthage 安装说明操作。添加您将使用的框架及其依赖项,然后检查每个框架的文档以开始。
由于ReactiveCocoa没有官方的CocoaPods支持,因此CocoaPods也不支持TheDistanceComponents。
在应用中表示数据的任何东西都可以被视为模型对象。这些可能是简单的Swift结构体或者是 NSManagedObject。我们将尽力不在Components中定义模型对象。如果必要的话,将使用协议,以便应用程序可以定义尽可能少受限制的自己的模型。
应用中每个视图都分为视图和ViewModel两部分。ViewModel负责所有逻辑,而视图则负责根据从ViewModel接收到的Model对象更新屏幕上显示的内容。这允许责任彻底分离并增加了测试性,而不会不必要地增加复杂度。视图可以是UIView的子类或者是ASDisplayNode。鉴于额外的性能和灵活性,我们将使用ASDisplayNode来定义默认视图组件。
为了将视图生命周期事件传递给“ViewModel”对象,应该将ReactiveAppearanceViewController
从UIViewController
派生出来。这提供了一个包含有ViewLifetime
事件信号的信号,可以在ViewModel上的MutableProperty<ViewLifetime>
上进行绑定。
视图应由AppDependencies单例中的ViewLoader创建,如TDCAppDependencies中定义。这允许开发可以提供默认行为框架,应用程序可以通过依赖注入进行专业化。Components提供了一些标准UI,使用AsyncDisplayKit,其中通过编程创建子类UIViewController
,与使用Storyboards相比,提供了更大的自定义灵活性。如果您使用Storyboards来加载视图,建议使用来自TheDistanceCore的StoryboardLoader
协议。
可以使用包含多个ViewModel对象的UIViewController
构建复杂视图。
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 和文档。有关这里讨论的主题的更多信息,您可以尝试以下内容:
如果您有任何疑问/建议,我们将非常乐意听到您的意见。