使用MVVM和RxSwift构建您的第一个应用程序

简介: 在本文中,我们将分四个部分逐步构建您的第一个Set应用程序。 第一部分将向您介绍MVVM应用程序体系结构。 第二部分将演示SetSDK设置过程。 第三部分将应用MVVM概念来为您的应用程序创建支架。 最后,在第四部分中,我们将使用SetSDK全天实时显示出发地和预计的目的地。

可以从Set Gitlab存储库下载该项目的源代码。

Set SDK允许任何开发人员通过简单的pod install将机器学习和用户行为预测集成到他们自己的应用程序中。 SDK的第一个版本侧重于用户位置,回答了以下问题:他们现在在哪里,下一步要去哪里?

我想提供一个简单的演示应用程序,以演示如何将SDK集成到您自己的项目中以及如何使用SDK的某些功能。 在我讲的时候,我将使用Apple的MVC(模型视图控制器)体系结构,MVVM(模型视图视图模型)和一种启用MVVM的技术(称为RxSwift)来替代它。

第一部分:MVVM概述

关于MVC设计模式为何变得令人头疼的信息很多,尤其是在更复杂的应用程序中。 MVC对视图控制器负有太多责任。 关注点很少。 在下图中,您将看到视图和模型主要只是存在而无需做任何事情,而视图控制器则负责更新和接收来自模型和视图的更新以及所有业务逻辑,数据库访问,联网等。

在复杂的应用程序中,视图控制器可能会增长为成千上万行代码,并且很难维护。

MVVM是对MVC的简单添加,它简化了视图控制器的作用:

对于您应用中的每个屏幕或视图控制器,我们都会引入一个附加文件,即视图模型。 视图模型负责与模型数据进行交互,并将业务逻辑和显示格式应用于该数据。 视图模型还可以利用数据库或网络抽象。 格式化的数据通常通过简单的属性,RxSwift Observable或类似的技术(稍后会详细介绍)提供给应用程序的视图层。

视图控制器的新角色是通常使用RxSwift之类的工具简单地将视图模型公开的数据“绑定”到视图。 视图控制器还处理诸如按钮轻击和手势之类的用户交互,将这些事件通知视图模型。 这样,视图和视图模型紧密耦合,可以视为单个功能单元。

MVVM可以使关注点更加清晰。 它从视图层中删除了业务逻辑和数据格式,并创建了易于通过单元测试进行测试的视图模型。 可以以“无头”方式(没有任何视图)测试许多应用程序,而可以使用更合适的工具(例如Xcode UI测试)来测试视图。 这样就导致了具有更少错误的应用程序,更易于维护。

第二部分 启动SetSDK应用

要启动SetSDK,您将需要应用程序的客户端凭据。 我们目前正在使用一个自助服务开发人员门户网站,您可以在其中创建这些凭据,但是现在发送电子邮件至sander@set.gl,您将通过电子邮件接收凭据。

SetSDK使用Cocoapods分发。 如果您不熟悉它,请访问他们的网站,其中有许多很好的入门指南。

使用File > New > Project… > Single View Application创建一个新的Xcode项目。 我叫我的MVVMSetSDK。 创建项目后,将其关闭并在命令行上导航到项目的根目录。

通过运行pod init初始化Cocoapods。 打开新创建的Podfile进行编辑,并向其中添加SetSDK依赖项:

并提供当我们要求使用他们的位置和运动数据时显示给用户的Info.plist字符串。

第三部分 MVVM支架

基本设计

我们应用的设计将决定我们创建的视图控制器和视图模型的类型,并确定这些视图模型如何相互通信。 对于此应用程序,我们的根视图控制器将是UINavigationController 。 该导航控制器的视图模型将负责创建与将被推送到导航堆栈的子视图控制器相对应的子视图模型。 我们将有两个子视图控制器,一个用于用户登录,一个用于在用户登录后显示来自SetSDK的数据:

创建根视图控制器和视图模型

首先打开Main.storyboard并删除您在其中看到的自动创建的视图控制器。 接下来,拖入一个UINavigationController并为其指定一个Storyboard ID rootViewController 。 您可以删除自动创建的UITableViewController ,该UITableViewController设置为导航控制器的根视图控制器。 我们将很快创建自己的。 您的情节提要应如下所示:

接下来,在您的应用程序中创建两个新的Swift文件RootViewModel.swift

接下来,我们将为LoginViewModel创建两个新的Swift文件:

让我们在登录屏幕上添加一些行为。 我希望在用户输入11位电话号码之前禁用“提交”按钮。 点击提交按钮后,我们将伪造一个真实的身份验证过程,并通知RootViewModel用户已成功登录。

即使在这个过于简化的示例中,您也可以看到MVVM和RxSwift的好处。 我们的代码简洁明了。 视图和业务逻辑之间存在良好的分离。 我们仅用几行声明性代码就为视图控制器添加了相当复杂的行为,而所有这些操作都没有我们通常在iOS中看到的委托,目标操作或NSNotification模式。

与父视图模型进行通信

有时,某些用户操作或事件将在最初接收它们的视图模型中进行处理。 在其他时候,我们可能希望在视图模型层次结构中更高的某个其他视图模型中处理事件或动作。 正如我之前提到的,视图模型应该对父视图模型一无所知,那么我们如何实现呢?

一种解决方案是在子视图模型上创建PublishSubjectPublishSubject与我们之前使用的BehaviorSubject相似,但不会将最新值发送给新订阅者)。 该子视图模型中的代码可以简单地通过调用PublishSubject.onNext(element:)发送事件或操作的数据表示。 在父视图模型创建子视图模型时,父视图可以订阅子事件PublishSubject ,然后在收到事件时做出适当响应。

第四部分 使用SetSDK

处理登录并启动SetSDK

我希望在RootViewModel处理SetSDK的启动,因此LoginViewModel不需要处理登录事件,但是我们需要让RootViewModel知道它。

让我们修改LoginViewModel以在用户成功登录时通过提交其电话号码来发送事件:

期待

这是Set激动人心的时刻。 我们看到了分享我们正在使用的某些工具的巨大潜力,包括我在本文中介绍的MVVM概念的结构化版本。 我们正在迅速向SDK添加新功能和行为预测API。 如果您有兴趣试用SDK,请注册以获取开发人员访问权,并随时关注我们的博客以获取更新。

我希望您已经学会了使用MVVM改进自己的应用程序的一些方法,并且我已经引发了一些关于将SetSDK的用户行为预测添加到自己的应用程序中可以执行的强大功能的想法。 谢谢阅读!

Interesting Posts