Tag: 应用架构

使用协调器构建应用程序:第一部分

驯服无节制的应用程序架构 链接到示例GitHub项目 注意:示例项目在撰写本文时尚未完成,目前只是草稿。 在过去的几个月中,我一直关注的开发领域之一就是构建模块化代码。 我在一月份回信了我尝试重构TaskHero时遇到的挫折感。 当时我说这不是我最后的决定,这是我要花时间反思的问题。 在此期间,我尝试了几种成功实现应用程序模块化的方法。 我发现构建模块化应用程序代码的更成功的方法之一是使用Coordinator设计模式和委托。 这篇文章是关于使用协调器构建应用程序以及使用它的优点/缺点的两部分系列文章的第一篇。 第一部分主要涉及概念和为什么要使用它的原因,第二部分将进一步介绍实现。 我已经建立了一个示例项目,但它还没有最终的形式,更多的是本文撰写时的草稿。 如果您有兴趣查看该示例,欢迎您。 我在顶部发布了指向它的链接。 信用到期 如果您还没有阅读Soroush Khanlou的博客,我强烈建议您开始阅读。 这是一个很好的资源,它帮助改变了我处理应用程序体系结构的方式。 这篇文章的灵感来自他的几篇文章。 我特别建议阅读他有关使用协调器的系列文章。 MVC可能意味着超过一件事 Model-View-Controller及其衍生产品是最常用的应用程序体系结构之一。 苹果定义: 模型-视图-控制器(MVC)设计模式为应用程序中的对象分配以下三个角色之一:模型,视图或控制器。 该模式不仅定义了对象在应用程序中扮演的角色,还定义了对象之间的通信方式。 三种类型的对象中的每一种都通过抽象边界与其他对象分开,并跨这些边界与其他类型的对象进行通信。 在应用程序中,某些MVC类型的对象的集合有时称为“ 层” ,例如模型层。 模型视图控制器 如果您生活在Apple编程世界中,那么您会很快了解到Apple一直在使用MVC架构。 实际上,MVC嵌入了UIKit的核心。 虽然MVC是一种非常有用的设计模式,但是如果处理不当,则会存在一些缺陷。 这些陷阱并不是一开始就很明显的,特别是如果您不熟悉编程的话。 MassiveViewController ViewController的基本问题之一是,随着应用程序开发的进行,它们会迅速变得庞大而笨拙。 这可能会导致多个问题。 首先,从实际的角度来看,要使用包含许多应用程序功能的不同部分的大型类可能会很困难。 由于可以广泛地解释ViewControllers的用途,因此很容易将似乎不适合其他地方的代码放入其中。 这可能导致MVC综合征-Massive-View-Controller。 ViewController的问题可能像Singletons一样,因为它们的用途是可以解释的,因此任何东西都可能属于它们。 抢救ViewModels? 大多数人试图克服MVC综合征时首先看的地方之一就是ViewModels 。 那么为何不? 这是一种向应用程序添加另一层抽象的方法,这正是我们想要的,对吗? 好的,这绝对是朝正确方向迈出的一步。 ViewModel是视图显示逻辑的抽象。 抽象之所以好,是因为它们使应用程序的不同区域分离。 抽象化应用程序功能的不同方面是我们如何整理代码的方式。 答案的一部分-不是解决方案 虽然ViewModels不是解决我们难题的灵丹妙药,但是它们也会出现问题。 首先,要隐藏在ViewModel的ViewController中填充的所有代码将变得非常容易,从而创建一个全新的综合症:Massive-View-Models。 发生这种情况时,我们的ViewController看起来很漂亮,但脏的秘密隐藏在ViewModel中。 使用ViewModels可以解决的只是一部分难题,它们的实用程序不应该被打折,而不能打折。 隐藏混乱不是我们要在这里努力的方向,我们想要的是模块化。 […]

使用VIPER架构构建Todo List iOS应用

介绍 确定构建iOS应用程序时使用哪种应用程序架构是最具挑战性的任务之一,可以从MVC,MVVM,MVP,View State,VIPER等众多架构中进行选择。 我们选择的体系结构将决定软件的构建方式以及随着软件的扩展而扩展。 本文将介绍的架构之一是VIPER架构。 VIPER以单一职责原则将应用程序结构划分为模块/屏幕内的组件。 这使应用程序变得更加模块化,并且与其他组件的耦合更少。 由于每个组件之间的边界(协议/接口),单元测试和集成测试变得更加简单。 VIPER的基本组件分为5部分: 视图:显示演示者告诉的用户界面,还将用户输入传达回演示者。 交互器:处理应用程序的业务逻辑,它与演示者进行来回通信 演示者:从交互器获取数据,并处理如何在视图中显示数据的逻辑。 它还从视图中继用户输入,并从交互器获取/更新数据。 实体:交互器使用的模型对象。 通常,交互器从单独的数据存储对象中获取实体。 路由/线框:处理演示者对象询问的导航逻辑。 它与要显示的其他模块/屏幕进行通信。 使用VIPER构建我们的待办事项列表应用 在本文中,我们将使用VIPER作为我们的应用程序体系结构构建一个简单的TodoList应用程序。 项目GitHub存储库可在此处获得。 我们将建立: TodoItem实体和TodoStore:TodoItem是代表Todo项的基本Class对象,TodoStore是存储TodoItem数组的DataStore。 TodoList模块/屏幕:向用户显示UITableView中TodoItem的列表,并为用户提供添加新TodoItem,删除TodoItem以及导航至TodoDetail模块/屏幕的功能。 TodoDetail模块/屏幕:显示TodoItem的内容,为用户提供删除和编辑TodoItem的功能。 它导航回到TodoList模块/屏幕。 应用程序委托集成:通过从TodoListRouter实例化TodoListView来设置应用程序的根UIViewController 建筑数据实体 TodoItem实体 TodoItem实体只是代表TodoItem对象的普通类。 它提供2个属性,标题字符串和内容字符串。 TodoItem实体 TodoStore数据存储 TodoStore是存储TodoItem列表的DataStore Singleton对象。 我们的应用程序只是将数组存储在内存中,但是将来我们可以扩展以将数据存储在File或CoreData中。 它通过todos属性和方法公开TodoItem数组,以添加TodoItem并删除TodoItem。 TodoStore 构建TodoListModule / Screen TodoListModule协议 我们为每个组件使用协议来定义每个组件如何在TodoList模块中进行通信的边界。 TodoListModule协议 实现TodoListViewProtocol 我们创建一个子类UITableViewController的TodoListViewController对象,并实现TodoListViewProtocol。 TodoListViewController的职责是按照演示者的指示显示用户界面。 它保留对演示者的引用,以中继用户输入并查看生命周期事件以使演示者做出反应。 当视图出现时,它将调用演示者viewWillAppear方法,以便演示者可以从交互器检索数据。 导航添加栏按钮项触发一个操作,该操作将显示带有2个文本字段的UIAlertActionController,供用户输入TodoItem的标题和内容。 然后,它将用户输入中继回演示者。 当用户滑动UITableViewCell并删除该行时,该视图会将用户输入重定向以将关联的ToDoItem删除回呈现给演示者。 TodoListViewProtocol提供2种方法来实现,showTodos传递ToDoItem数组,该数组将用于在UITableView内部显示TodoItem的列表。 如果演示者发生错误,showErrorMessage会传递一条错误消息,该UIAlertController将显示给用户,其中包含错误消息。 TodoList视图 实现TodoListPresenterProtocol […]