MVVM和协调器模式一起

今天让我们来谈谈创建应用程序时的常见问题。 应该选择哪种设计模式? 实际上,在构建iOS应用程序时可以使用许多模式:MVC,MVP,MVVM,VIPER等。这些是iOS中最常用的模式,每种模式彼此之间使用不同的方法,但最后哪种方法最好? 这取决于您从事的工作,项目的规模以及构建应用程序所花费的时间。

如果您想了解有关这些模式的更多信息,可以阅读本文:Bohdan Orlov的iOS体系结构模式。

现在让我们讨论两种不同的模式:

  • MVVM 视图模型负责以易于管理和显示对象的方式公开(转换)来自模型的数据对象。 换句话说,这是模型和view / viewController之间的桥梁。 这是避免Massive视图控制器将逻辑移至View模型的一种绝佳方法。
  • 协调者 协调者或中介者将负责我们的应用程序路由(导航),然后view / viewControllers不需要知道它们在哪里或是否在导航内,它们只需要将导航操作发送到协调员/调解员。

MVVM运行中

首先让我们看一下MVVM的工作原理,以及为什么这对我们非常重要。

这有点容易理解它是如何工作的:

  1. view / viewController将事件或任务发送到viewModel
  2. viewModel执行任务(在后端中获取内容,执行操作,获取模型等)
  3. viewModel通过以下方式通知viewController:KVO,委托,回调,绑定等。

实际上,如今,如果您听到“ MVVM”,则认为是Reactive编程,反之亦然。 尽管可以通过简单的绑定来构建MVVM,但是RxSwift和RxCocoa将允许您获取大部分MVVM。

这样,我们将使用RxSwift来获取一些数据,并使用RxCocoa将数据绑定到视图来制作示例。

  • 首先我们有viewController:

在这里,我们有好处:

  • 分发 —现在,我们的viewController不再关心模型,它只是将事件发送到视图模型,并执行任务,完成后将响应发送回视图控制器,实际上视图控制器不知道什么真正发生在后台,因为现在这不是它的责任:)。
  • 可测试性视图模型视图一无所知,这使我们可以轻松对其进行测试。 View也可能已经过测试,但是由于它是UIKit依赖的,因此您可能希望跳过它。
  • 可重用性 -由于我们的viewControllers不执行特定任务,因此很容易重用项目中的大量代码和视图以及视图模型。
  • 可扩展性 —现在,由于角色定义明确并且视图控制器并没有像以前使用MVC(大型视图控制器)那样执行很多任务,因此项目易于更改或更新。

是时候到协调员了

我们的应用程序看起来非常好,但是仍然有一个大问题,如果我要转到另一个屏幕,该任务由谁负责,viewController,viewModel,该怎么办? 答案不是全部,我们需要架构中的新元素来处理应用程序路由。

让我们尝试将协调器添加到我们的应用程序中,但首先我们需要了解应用程序应在何处以及如何运行。

好的,它看起来比以前非常相似,但是现在我们有了一个新的组件协调器,它负责处理应用程序路由。 通常,您的项目中有许多协调员,因为您的应用程序中有不同的导航和模块。 您可以将协调器与UITabBarController,UISplitViewController等容器相关联,或与UINavigationController之类的导航相关联,这些是应用程序中最常用的容器和导航。 每次您需要创建其中一个时,就知道需要一个协调器来处理流程:)。

现在是时候编写一些代码并观看协调员的实际行动了。

  • 首先,让我们更改视图控制器以了解用户何时选择行。

这很简单,我们只调用方法modelSelected(Repository.self) ,然后将存储库绑定到视图模型。

  • 现在更新视图模型。

在这里,我们有一些新东西让我们看看:

  1. 现在,我们的视图模型符合一个名为Transitionable的协议,该协议仅具有一个名为navigationCoordinator的属性
  2. 每次用户在表视图中选择一行时,都会调用subscriberejectSubject。
  3. 调用performTransition这不需要解释🙂
  • 最后一部分是协调员。

这也非常容易,我们有一个自定义的init()方法,在其中创建视图模型和导航控制器,然后将navigationCoordinator分配给self。

最后,我们的协调器实现了performTransition(transition:Transition)方法,就是这样,我们所有的应用程序组件都已准备就绪并可以正常工作。

这就是这里的全部,希望您喜欢这种体系结构并喜欢使用它。 这是最终项目

在Twitter上关注我,以了解有关iOS开发 Gorozco58的 更多信息 在Github上关注我,了解很多iOS代码 Gorozco58

结论

我们已经了解了一起使用设计模式的强大功能,以及它如何帮助您拥有强大的体系结构和可扩展的应用程序。

另外,我们已经了解了如何使用RxSwift绑定到视图,而viewModel这是最好的方法(对我而言),如果您要使用MVVM,一切都将变得更加清晰,并且无论如何,您可以使用RxSwift保存40%以上的代码做到这一点的方法。 由您决定which。

感谢您的阅读! 如果您喜欢这篇文章,请点击“推荐”(❤按钮),以便其他人也可以阅读:)。