具有ReactiveKit的iOS中的MVVM

使用ReactiveKit实现MVVM登录示例

如果您已经开发iOS已有一段时间了,那么您可能已经听说过MVCMassive View Controller 这种现象可以从对视图控制器中的Web服务器的无辜调用开始,然后突然出现:一个庞大的ViewController ,它有成百上千行,大量的职责和测试的噩梦。

苹果的MVC有很多替代方案,例如MVPMVVMVIPER 。 在本文中,我决定尝试使用ReactiveKit进行MVVM方法。

观看Bohdan Orlov撰写的有关iOS体系结构模式的精彩文章。

为什么选择ReactiveKit ? 关于RxSwiftReactiveCocoa的样本很多,但实际上ReactiveKit的样本很少。 我真的很喜欢它的前身SwiftBond,所以我决定尝试它的演变。

在本文中,我们将基于ReactiveKitMVVM创建一个简单的Login示例。 我们将使用三个依赖项: ReactiveKitReactiveUIKitAlamofireReactive 。 您可以在ReactiveKit Github上了解有关它们的更多信息。

MVVM反应性登录

让我们开始创建一个简单的ViewController的示例,其中包含两个文本字段(用户名和密码)和一个登录按钮。

IBOutlet链接到ViewController之后,我们将创建一个新的ViewModel类。 此ViewModel将保存ViewController将观察的属性 ,以更新其视觉状态。

属性将可变状态包装到可以观察该状态的对象中。 每当状态改变时,就可以通知观察者。 — ReactiveKit

但是,让我们从更简单的事情开始。 让我们创建一个initializer ,它接收两个属性 (一个用于用户,一个用于密码)并开始观察更改:

ReactiveUIKit已经具有UI元素的多个属性,例如`rText`,这使将变量绑定到动作变得非常容易。

看! 现在,在用户键入每个字符后,我们会收到通知!

让我们继续并使用此属性做一些更有用的事情。 如果在字段中未输入任何文本,则将它们组合在一起以禁用登录按钮,并在用户键入有效的用户/密码组合后将其启用:

太棒了! 通过组合来自用户和密码的新值,我们可以决定是否要启用或禁用登录按钮,只需设置属性并将其绑定在按钮上,UI就会自动更新!

测试我们的ViewModel也变得轻而易举 。 我们可以模拟用户和密码的属性 ,然后测试ViewModel行为,而无需处理IBOutletsUIViewControllers

注意:Quick用于BDD测试。

调用我们的后端以验证数据

好的,到目前为止还不错,但是我们仍然需要实际登录用户,对吗? 我们的登录Api将如下所示:

注意:在示例存储库中,您可以找到用于测试的假登录服务器。

ReactiveAlamofire允许我们将请求转换为Operation ,这使我们可以灵活地使用flatMapError处理错误。 如果发生某些错误,我们可以将其映射到包含解析器知道如何表示的错误的json

操作用于表示可能会失败的任务,例如获取网络资源,读取文件等。 — ReactiveKit

处理了请求错误后,我们可以解析json并将整个操作映射到LoginResponse 回到ViewModel,我们可以创建Properties来处理来自服务器的响应:

但是,我们仍然没有为登录按钮设置IBAction以启动登录过程。 而且我们不会 。 我们将借助ReactiveUIKit帮助将水龙头流发送到我们的ViewModel

好了! 现在我们只需要设置我们的观察者

就是这样! 如果用户成功登录,我们将收到令牌通知,否则我们将收到错误消息。

从这往哪儿走

如果您对此示例的更完整版本感兴趣,请查看github存储库

另外,我强烈建议您花一些时间在reactx.io上阅读有关ReactiveX的更多信息。

关于如何改进的任何想法? 在下面留下注释,在示例项目中创建问题或提交请求请求!