Tag: Mvc

苹果公司“面向协议和价值的编程” WWDC17演讲摘要

这是WWDC 2017演讲的简短表格摘要,仅重点说明要点和关键示例: UIKit应用程序中面向协议和价值的编程– WWDC 2016 –视频– Apple Developer 在去年的面向协议的编程和具有值类型的会议上构建更好的应用程序的基础上,今年的…… developer.apple.com 您可以从WWDC视频中下载完整的示例代码: https://developer.apple.com/library/content/LucidDreams/Introduction/Intro.html#//apple_ref/doc/uid/TP40017334 本地推理-关于功能的独立思考。 您不必了解应用程序的整个上下文即可维护各个功能。 您应该只能够应用局部推理来理解各个功能。 MVC:模型存储您的数据。 视图将显示它。 控制器在两者之​​间进行协调。 使用Structs之类的Value类型与Classs之类的引用类型相比,可以促进局部推理,简化关系,并使代码更具可测试性。 结构在其所有成员上赋予值语义和独立存储。 在模型层中使用值类型是标准且无争议的。 但是,一旦您开始在其他地方(例如控制器)使用值类型,人们通常会犹豫不决,或者不知道该怎么做。 例如,子类化一个tableview单元是有限的,因为您不能在不是单元格的其他视图中重用该代码。 代替使用UITableViewCell子类,我们可以将其更改为结构并实现layout(in rect:CGRect)方法: 然后,我们更新单元格子类以在上述布局结构中调用图形调用。 现在,我们还可以从其他区域调用此绘图代码,而不仅仅是表格视图单元格: 通过为布局代码提供样本以进行内部布局,然后验证生成的框架,也可以更轻松地对布局代码进行单元测试。 我们不必考虑该视图使用或替代的其他特定视图功能。 现在,我们可以更改布局对象以使用协议,而不是引用UIViews。 这样我们就可以将布局逻辑也应用于其他类型的对象(例如Sprite Kit对象),而不仅仅是UIView子类。 下面我们还使用“ Retroactive Modeling”使UIView和SKNode都符合我们的布局协议: 协议是通过继承实现多态性的绝佳解决方案,因为您可以将相同的额外行为应用于任何不相关的类型。 当前,“内容”和“装饰”都可以是任何类型的对象,并且它们不必是同一类型。 如果我们想将两个约束为相同类型,可以使用泛型通过在结构上指定所需的类型来实现。 (现在,内容和装饰都必须与传入的Child类型相同): 使用泛型还可以为编译器提供有关代码正在执行的操作的更多信息,并允许我们进一步优化代码以提高性能。 继承牺牲了“局部推理”,因为您必须考虑父类在做什么,它如何工作,将要更改或覆盖的内容以及如何使其与父行为一起工作。 如果要继承系统对象,那么这些对象也将非常复杂。 它使您的思维在父母和班级之间跳来跳去,系统变得更难以理解。 合成意味着将许多较小的片段组合在一起,以制成较大的片段。 类很昂贵,会导致堆分配。 使用类来构成视图非常浪费。 结构更便宜,并且具有有价值的语义(因此具有更好的封装性)。 没有人可以修改您的副本。 您可以使用以下结构为不同的布局类编写视图组成代码: 但是,仍然存在更好的方法,只需简单地使布局结构也符合布局协议即可。 (从它们两个中都删除冗余方法布局): 现在,我们的视图和布局都使用相同的Layout方法,将自己定位在给定的rect中是他们的责任。 合成使我们能够以声明的方式构建高级布局: 如果我们希望布局以正确的顺序相互嵌入视图(层叠),则每个布局都需要以正确的顺序将其子级返回给其所有者。 因此,我们可以在内容上实现get方法,并让每个实现者返回其所有视图。 […]

我们喜欢软件架构模式

我们作为世界上的移动开发人员,通常会使用许多很酷的软件体系结构模式,通常都包含字母M和V(MVC,MVP,MVVM,VIPER),这会对新编写应用程序的人造成很大的挑战或困扰。 让人们重新关注这种模式应该做什么也很好。 有什么问题? 从头决定如何在大型应用程序中构建每个组件是多余的。 您面向用户的组件都将获取数据,然后根据该数据在屏幕上绘制并接收用户交互。 我们喜欢MVC / MVP和MVVM之类的设计模式或概念框架,因为它们提供了模型,视图和控制器之类的抽象对象来划分职责,并确保组件井井有条。 但是我想做更多的事情! 大多数时候,您将需要分离其他对象来处理获取数据,处理数据以及处理用户交互的后果。 最后,对这些背景对象的引用由与视图相关的组件保留。 当您需要分开职责,想要重用组件并帮助允许访问与视图无关的状态(例如,您有多少消息或是否已登录)时,可以这样做。 网络和数据持久性是经常需要分开的职责的示例。 处理这些组件的状态和状态,尤其是当它们可能在应用程序的多个页面之间共享时,变得很困难。 毒蛇巢 VIPER是一种比MVC更进一步的体系结构,它为更复杂的应用程序指定了各种额外的组件。 由显示内容并接收用户交互的视图 ,分析数据并确定要显示的内容的交互器和演示者 ,代表数据的实体以及路由器组成 ,以处理已显示的页面并进入新的页面。 这是一个很好的框架,请在此处阅读。 冲床 通常情况下,各个组件的状态会耦合在一起,这意味着您必须在不模拟整个应用程序或某些特定用户旅程的情况下,才能测试应用程序某一部分会发生的情况(“该错误仅在我尝试下达一个订单并取消它,然后尝试注销”-希望这永远不是真的)。 您还失去了对应用程序进行安全的结构更改的能力,因为您不知道后果将达到多远。 本质上,在应用程序的整个生命周期中,拥有一个良好的组件设计系统并实施通用样式,可以创建出更快地编写(希望),更易于维护(更易于理解和更改)并保持脱钩(也称为可测试)。 有关 首先编写测试会更好 苹果的MVC不是MVC 协调员,现在听起来很花哨

Swift中MVC的替代方法:基本MVVM结构

MVVM(模型-视图-视图-模型)和MVC(模型-视图-控制器)是iOS设计模式。 Apple将设计模式定义为设计的模板,以解决特定情况下的普遍性重复性问题。 它是一种抽象工具,在诸如体系结构和工程以及软件开发等领域非常有用。 在MVVM中,我们在不同的MVC层之间添加了一个称为ViewModel的层。 它由引用我们要表示或交流的实例的类或结构组成。 假设我们要列出服务的结果。 在此示例中,我将列出新闻来源。 为了做到这一点,我创建了Source模型类: 类来源{ var id:String 变量名:String var说明:String init(id:String,name:String,description:String){self.id = id self.name =名称 self.description =说明 } // … 如果我们想在ViewController中列出我们的Sources,我们可以使用一个封装Controller所需信息的类。 我们称它为SourceViewModel: 类SourceViewModel {var id:String 变量名:String var说明:String init(source:Source){self.id = source.id self.name =源名称 self.description = source.description } // … 但是,控制器需要的信息不是来源的信息,而是来源列表的信息。 因此,我们需要诸如更高级别的视图模型,源(列表)视图模型之类的东西。 创建它: 类SourceListViewModel { private var webservice:Web服务 私有(一组)var sourcesViewModel:[SourceViewModel] = [SourceViewModel]() 私人var完成:()->()= {} […]

MVC做对了

或一些想法,以更好地设计您的MVC应用 我一直在写有关MVP或MVVM之类的出色架构模式的文章,但是我们软件开发人员必须问自己一个非常重要的问题:我们是否按照预期的方式使用MVC? 我们是否真的研究过MVC还是只是使用了MVC?我们是在一些古老的Objective-C教程中学到的,只是将ViewControllers像神一样实现了所有功能? MVC:什么是MVC? 如果您了解自己的知识,并且不需要任何人提醒您有关MVC的全部信息,请随时跳到下一部分。 我将撰写有关MVC内容的简短概述。 MVC在1970年代开始在著名的Xerox Parc Alto Research实验室中使用。 当苹果家伙从Altos机器上窃取UI时,他们忘记了窃取MVC。 MVC提出的方案是将您的程序分为三层,这两层相互交互,从而自然地分离出软件的职责。 值得一提的是,MVC主要用于具有UI以及与该UI进行用户交互的应用程序。 例如,在后端实施这种模式没有多大意义。 另一个常见的错误是将整个程序视为MVC(实际上并没有错),而是一个更具哲学意义的问题,而不是一个具体的实现方法。 每个视图都应复制MVC三重奏,并且此组件应相互通信。 模型 :模型表示我们在应用程序中使用的抽象。 这可以是用户,销售,物品等。如果我们使用某种网络层,则模型可能在后端启动,并最终由我们的程序继承。 View :View代表实际的用户界面。在iOS / MacOS开发中,我们使用Xcode的Interface Builder(曾经是一个单独的工具,但在最近几年中已成为Xcode的一部分)创建Views。 尽管我们可能实际上并未编写View的代码, Controller :(或实际上是ViewController )如图2所示,这是Model-View-Controller模式的核心组件。 控制器是您应用程序内部结构的基础。 每个应用程序至少都有一个视图控制器,大多数应用程序都有多个。 每个视图控制器管理应用程序用户界面的一部分,以及该界面与基础数据之间的交互。 ViewControllers是我们实现MVC控制器部分的重要部分,但不是唯一的一部分。 我们将在本文中进一步讨论其他类型的Controller。 如Apple文档所述: 对于iOS应用程序,视图控制器提供了应用程序数据与其外观之间的重要链接。 了解何时以及如何使用视图控制器对于iOS应用程序的设计至关重要。 视图控制器是“模型-视图-控制器”设计范例中的传统控制器对象,但它们还有很多其他功能。 在iOS应用程序中,视图控制器提供了管理基本应用程序行为所需的大部分逻辑。 例如,视图控制器管理屏幕上内容的呈现和删除,并响应于设备方向的变化来管理视图的重新定向。 可以合并由和对象扮演的MVC角色,例如,使一个对象同时满足控制器和视图角色的要求,在该角色中,它被称为视图控制器。 MVC并不是真正地构建整个应用程序,它专注于与用户交谈时进行结构化以及用户如何使用它。 如果您正在使用数据库密集型应用程序,那么这可能不是最佳架构。 MVC在每个视图中实现 要牢记的一件重要事情(我实际上与我的一位同事进行过讨论,他的经验非常丰富,所以我想这可能会对其他人有所帮助)是MVC并不是您应用于应用程序的模式作为一个整体,而是在每个应用程序视图中重复执行的操作。 正如我们在一个假设的应用程序的图3上看到的那样,MVC模式在每个View上不断重复。 MVC面临着“大型视图控制器”综合症或问题:我们实际上拥有这些庞大的ViewController,它们可以处理所有事情:网络呼叫,业务逻辑,数据解析, 人类牺牲,猫狗共处……歇斯底里! 一切都交织在一起,解析器在解析完成后更新了UI(为什么不呢?) 如果这个问题没有道理,答案也不是:任何显然不是数据或显然是图形的东西都会被放入无定形的“控制器”集合中,这最终将整个代码库吸入内部,就像黑洞在其下方塌陷一样。自重” Graham Lee,Inside-Out Apps ViewControllers是您的朋友 避免使用这种可怕的,巨大的ViewController的一个好主意是让多个ViewController控制显示给用户的实际View,而不是使用一个由较小ViewController组成的复合ViewController,自iOS 5起可用 […]

Swift —以编程方式自动布局和绑定方法(2/4)

让我们记住在本系列的最后一部分中所做的事情。 我们展示了如何将UI组件添加到视图层次结构,然后以编程方式设置其属性。 大! 🎉 在这一部分中,我将向您介绍如何通过Omar Albeik的方式设置项目。 记得: 使MVC再次出色! 使用泛型,协议和扩展摆脱大型视图控制器 medium.com ✅项目结构受到控制。 以编程方式自动布局 layoutViews是我们新方法的override方法。 设置我们的约束以获取合适的布局的最佳位置。 ‍🍳 我们是一家出版物,创建有关iOS开发的帖子。如果您喜欢它并想加入我们,请填写表格! tinyurl.com/jointowhoknows

Swift 4.2 MVC简化了…

MVC,模型视图控制器是iOS开发中的一种现代方法。 如果您耐心并逐步学习,则易于理解和掌握。 我认为当您不熟悉iOS开发时,非常重要的一点是要了解这一点,原因是一旦开始开发,您就会习惯它。 即使您做错了! 别担心,我会尽力将所有事情解释得尽可能简单,这样您就不会犯常见的错误。 从一开始就学习并逐步掌握它是非常好的。 那么什么是MVC? 为什么这么重要? MVC是苹果推荐的要在iOS平台上开发的体系结构。 它代表您已经知道的Model View Controller。 现在让我们进一步潜水🙂 MVC由三个组件组成- – 模型:这就是您的数据所在的地方。 所有与数据相关的代码,甚至是网络代码,都位于此处。 – 视图 :这是您应用程序的正面。 – 控制器 :它使用几种方式(例如,委托模式,观察者模式等)在视图和模型之间进行中介。在本文中,我们将使用委托模式。 好,让我们去看看。 我将制作一个简单的应用程序,其中显示了Employee的个人资料: 让我们创建一个单视图应用程序,我将其命名为SampleMVC。 在这里,我在主StoryBoard中向View添加了一个UITableView ,并且UIViewController嵌入在UINavigationController中。 让我们添加UITableView的IBOutlet并实现UITableViewDataSource方法。 现在,我们将为数据实现一个结构类。 我们将使用虚拟api获取员工列表。 我们从api获取员工对象数组。 这是单个雇员对象的样子: { “id”: “1”, “employee_name”: “Tiger Nixon1”, “employee_salary”: “3208001”, “employee_age”: “611”, “profile_image”: “images\/default_profile.png” } 让我们在名为Models的项目文件夹中创建一个Group并创建 EmployeeDataModelItem中的swift文件。 同样适用于视图和控制器。 它将使您的项目安排得井井有条🙂 我们将使本教程尽可能简单。 这就是为什么我将创建一个像这样的简单类的原因: 我在EmployeeDataModel中添加了requestData和setData方法。 希望您通过本示例了解MVC的概念。 如果您有任何疑问,请在评论中提问🙂