您的位置 首页 > 德语词汇

coordinator是什么意思,coordinator的意思翻译、用法、同?Coordinators

本篇文章给大家谈谈coordinator是什么意思,coordinator的意思翻译、用法、同,以及Coordinators对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

coordinator是什么意思,coordinator的意思翻译、用法、同?Coordinators

去年,我们的团队开始在生产应用中使用Coordinators和MVVM。起初看起来很可怕,但是从那时起到现在,我们已经完成了4个基于这种模式开发的应用程序。在本文中,我将分享我们的经验,并将指导你探索MVVM,Coordinators和响应式编程。

我们将从一个简单的MVC示例应用程序开始,而不是一开始就给出一个定义。我们将逐步进行重构,以显示每个组件如何影响代码库以及结果如何。每一步都将以简短的理论介绍作为前提。

在这篇文章中,我们将使用一个简单的示例程序,这个程序展示了GitHub上不同开发语言获得星数最多的库列表,并把这些库以星数多少进行排序。包含两个页面,一个是通过开发语言种类进行筛选的库列表,另一个则是用来分类的开发语言列表。

用户可以通过点击导航栏上的按钮来进入第二个页面。在这个开发语言列表里,可以选择一个语言或者通过点击取消按钮来退出页面。如果用户在第二个页面选择了一个开发语言,页面将会执行退出操作,而仓库列表页面也会根据已选的开发语言来进行内容刷新。

你可以在下面的链接里找到源代码文件:

这个仓库包含四个文件夹:MVC,MVC-Rx,MVVM-Rx,Coordinators-MVVM-Rx。分别对应重构的每一个步骤。让我们打开MVCfolder这个项目,然后在进行重构之前先看一下。

大部分的代码都在两个视图控制器中:RepositoryListViewController和LanguageListViewController。第一个视图控制器获取了一个最受欢迎仓库的列表,然后通过表格展示给了用户,第二个视图控制器则是展示了一个开发语言的列表。RepositoryListViewController是LanguageListViewController的一个代理持有对象,遵循下面的协议:

RepositoryListViewController也是列表视图的代理持有对象和数据源持有对象。它处理导航事件,格式化可展示的Model数据以及执行网络请求。哇哦,一个视图控制器包揽了这么多的责任。

TheRepositoryListViewControllerisalsoadelegateandadatasourceforthetableview.Ithandlesthenavigation,formatsmodeldatatodisplayandperformsnetworkrequests.Wow,alotofresponsibilitiesforjustoneViewController!

另外,你可以注意到RepositoryListViewController这个文件的全局范围内有两个变量:currentLanguage和repositories。这种状态变量使得类变得复杂了起来,而如果应用出现了意料之外的崩溃,这也会是一种常见的BUGS来源。总而言之,当前的代码中存在着好几个问题:

我们需要被动地处理状态的变化;

是时候去见一下我们新的客人了。

这个组件将允许我们被动的响应状态变化和写出声明式代码。

Rx是什么?其中有一个定义是这样的:

ReactiveX是一个通过使用可观察的序列来组合异步事件编码的类库。

如果你对函数编程不熟悉或者这个定义听起来像是火箭科学(对我来说,还是这样的),你可以把Rx想象成一种极端的观察者模式。关于更多的信息,你可以参考开始指导或者RxSwift书籍。

让我们打开仓库中的MVC-RX项目,然后看一下Rx是怎么改变代码的。我们将从最普遍的Rx应用场景开始-我们替换LanguageListViewControllerDelegate成为两个观测变量:didCancel和didSelectLanguage。

LanguageListViewControllerDelegate变成了didSelectLanguage和didCancel两个对象。我们在prepareLanguageListViewController(_:)方法中使用这两个对象来被动的观察RepositoryListViewController事件。

接下来,我们将重构GithubService来返回观察对象以取代回调block的使用。在那之后,我们将使用RxCocoa框架来重写我们的视图控制器。RepositoryListViewController的大部分代码将会被移动到setupBindings方法,在这个方法里面我们来声明视图控制器的逻辑。

现在我们可以不用在视图控制器里面实现列表视图的代理对象方法和数据源对象方法了,也将我们的状态变化更改成一种可变的主题。

我们已经使用RxSwift和RxCocoa框架来重构了示例应用。所以这种写法到底给我们带来了什么好处呢?

所有逻辑都是被声明式地写到了同一个地方。

我们通过观察和响应的方式来处理状态的变化。

我们使用RxCocoa的语法糖来简短明了地设置列表视图的数据源和代理。

我们的代码仍然不可测试,而视图控制器也还是有着很多的逻辑处理。让我们来看看我们的架构的下一个组成部分。

MVVM是Model-View-X系列的UI架构模式。MVVM与标准MVC类似,除了它定义了一个新的组件-ViewModel,它允许更好地将UI与模型分离。本质上,ViewModel是独立表现视图UIKit的对象。

首先,让我们创建一个ViewModel,它将准备在View中显示的Model数据:

接下来,我们将把所有的数据变量和格式代码从RepositoryListViewController移动到RepositoryListViewModel:

现在,我们的视图控制器将所有UI交互(如按钮点击或行选择)委托给ViewModel,并观察ViewModel输出数据或事件(像showLanguageList这样)。

我们将为LanguageListViewController做同样的事情,看起来一切进展顺利。但是我们的测试文件夹仍然是空的!ViewModels的引入使我们能够测试一大堆代码。因为ViewModels纯粹地使用注入的依赖关系将输入转换为输出。ViewModels和单元测试是我们应用程序中最好的朋友。

我们将使用RxSwift附带的RxTest框架测试应用程序。最重要的部分是TestScheduler类,它允许你通过定义在何时应该发出值来创建假的可观察值。这就是我们测试ViewModels的方式:

好啦,我们已经从MVC转到了MVVM。但是两者有什么区别呢?

数据处理的逻辑与视图控制器分离;

我们的ViewControllers还有一个问题-RepositoryListViewController知道LanguageListViewController的存在并且管理着导航流。让我们用Coordinators来解决它。

你还没有听到过Coordinators的话,我强烈建议你阅读SoroushKhanlou[这篇超赞的博客](khanlou.com/2015/10/coo…

简而言之,Coordinators是控制我们应用程序的导航流的对象。他们帮助的有:

该图显示了应用程序中典型的coordinators流程。AppCoordinator检查是否存在有效的访问令牌,并决定显示下一个coordinator-登录或TabBar。TabBarCoordinator显示三个子coordinators,它们分别对应于TabBaritems。

我们终于来到我们的重构过程的最后。完成的项目位于Coordinators-MVVM-Rx目录下。有什么变化呢?

首先,我们来看看BaseCoordinator是什么:

该通用对象为具体coordinators提供了三个功能:

启动coordinator工作(即呈现视图控制器)的抽象方法start();

在通过的子coordinator上调用start()并将其保存在内存中的通用方法coordinate(to:);

为什么*start*方法返回一个*Observable*,什么又是*ResultType**呢?

ResultType是表示coordinator工作结果的类型。更多的ResultType将是Void,但在某些情况下,它将会是可能的结果情况的枚举。start将只发出一个结果项并完成。

我们在应用程序中有三个Coordinators:

Coordinators层级结构的根AppCoordinator;

让我们看看最后一个Coordinator如何与ViewController和ViewModel进行通信,并处理导航流程:

LanguageListCoordinator工作的结果可以是选定的语言,如果用户点击了“取消”按钮,也可以是无效的。这两种情况都在LanguageListCoordinationResult枚举中被定义。

在RepositoryListCoordinator中,我们通过LanguageListCoordinator的显示来绘制showLanguageList的输出。在LanguageListCoordinator的start()方法完成后,我们会过滤结果,如果有一门语言被选中了,我们就将其作为参数来调用ViewModel的setCurrentLanguage方法。

注意我们返回了*Observable.never()*因为仓库列表的页面一直都是在视图栈级结构里面的。

我们完成了我们最后一步的重构,我们做了:

把导航栏的逻辑移除出了视图控制器,进行了解耦;

将视图模型注入到视图控制器中;

以鸟瞰图的方式,我们的系统是长这样子的:

应用的Coordinator管理器启动了第一个Coordinator来初始化ViewModel,然后注入到了视图控制器并进行了展示。视图控制器发送了类似按钮点击和cellsection这样的用户事件到ViewModel。而ViewModel则提供了处理过的数据回到视图控制器,并且调用Coordinator来进入下一个页面。当然,Coordinator也可以传送事件到ViewModel进行处理。

我们已经考虑到了很多:我们讨论的MVVM对UI结构进行了描述,使用Coordinators解决了导航/路由的问题,并且使用RxSwift对代码进行了声明式改造。我们一步步的对应用进行了重构,并且展示了每一步操作的影响。

构建一个应用是没有捷径的。每一个解决方案都有其自身的缺点,不一定都适用于你的应用。进行应用结构的选择,重点在于特定情况的权衡利弊。

当然,相比之前而言,Rx,Coordinators和MVVM相互结合的方式有更多的使用场景,所以请一定要让我知道,如果你希望我写多一篇更深入边界条件,疑难解答的博客的话。

原文地址:TamingGreatComplexity:MVVM,CoordinatorsandRxSwift

本文永久链接:github.com/xitu/gold-m…

关于coordinator是什么意思,coordinator的意思翻译、用法、同的内容到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023