《Swift iOS应用开发实战》——3.1MVC设计模式简介

简介:

本节书摘来自华章计算机《Swift iOS应用开发实战》一书中的第3章,第3.1节,作者:刘铭 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.1MVC设计模式简介

要想成为一名优秀的iOS程序开发人员,至少要具备一种面向对象程序设计语言的开发经验,比如Java、C++或C#,并且C语言也是我们必须熟练掌握的,在此基础上学习Swift语言就会游刃有余。除此以外,我们还要对设计模式有一定的了解。在iOS中最重要的,也是使用最多的一种设计模式就是:模型-视图-控制器(Model-View-Controller,MVC)设计模式。
在开发面向对象应用程序之前(甚至是面向对象程序开发成为主流后的一段时间),程序员们在编写程序代码时还总是愿意将用户界面代码、应用程序逻辑和数据处理代码混合在一起。其好处就是可以快速完成一个初期的项目,但是后期维护和升级时会让整个项目变得举步维艰。
例如,假如你的项目团队为Windows平台开发了一个文本编辑器,但是当需要将它移植到Mac OS平台的时候,我们不得不将基于Windows用户界面的代码从数据和逻辑代码中剥离,然后替换成相应的Mac OS用户界面代码,难度可想而知。但是再将其移植到Web平台呢?还需要经历这一痛苦的过程。要想完成这个“壮举”,往往需要付出非常大的努力,并且讨论到最后可能最省事的方法会变成独立为每个平台重写所有的代码。
MVC设计模式的目的就是将应用程序的用户界面代码、程序逻辑和数据处理代码彼此分离。在这里,Model封装了应用程序的数据,View负责呈现和管理用户界面,Controller则提供应用程序的基本逻辑,并作为Model和View的“中间人”。当用户与View进行交互时,Controller可以命令Model修改数据。当Model数据发生改变时,Controller也要通知View进行界面更新。这样做的意义在于Model与View之间不会发生任何联系,Model只是负责存储和处理数据,当控制器调用数据时,Model只要完成自己的任务就好。
在Swift语言中,我们所创建的任何类都属于下面这三个类型中的一个:视图对象(View)、数据模型对象(Model)或控制器对象(Controller)。通常一个应用程序不仅限于只有一个Model、View和Controller。在Swift中我们通常把控制器叫作视图控制器(View Controller)。
视图控制器与数据模型对象之间的交互主要通过数据模型对象中的公共方法和属性,这与在面向对象(OOP)环境中对象之间的调用相同。
视图控制器与视图之间的交互会稍微复杂一点,需要借助Outlet和Action通过目标(Target)-动作(Action)模式实现,在第2章的学习中我们已经接触到了。
简而言之,MVC设计模式要求在iOS应用程序开发的过程中,所有的对象必须属于Model、View、Controller三大“阵营”中的一个。
视图对象是负责用户界面的对象,比如在Calculator项目的故事板里面,View Controller场景中的Label和Button都是视图对象。一般来说,视图对象是UIView类或其子类,比如UILabel、UIButton、UISlider等。当然,如果需要,还可以自定义一些视图类对象,如BackgroundView、ShoppingView等,相信看到这些类的名字,你就能够猜出它们是负责呈现信息的视图对象。
数据模型对象是负责处理数据的,它与视图对象之间不发生任何关系。在本章的实践中,Model对象只是操作数(firstOperand和secondOperand)、操作符(operatorFlag)等变量。
作为数据模型对象,它们通常是一些标准的集合对象(如NSArray、NSDictionary和NSSet类)和一些标准数据对象(如NSString、NSDate、NSNumber类)。对于大型或复杂的数据模型,往往需要创建自定义类并伴随着数据库的支持,例如Shopping、Employee等。
如果把应用程序看作一座工厂,那么视图对象和数据模型对象就好比是工厂中不同分工的工人,他们都只负责做好自己应该做的事情。例如,Label对象只负责在用户界面中的指定位置显示一个指定尺寸的文本信息,至于文本的内容它并不关心,到时候“会有人告诉他”。而String对象只负责存储一个字符串,至于这个字符串用在哪里他并不关心,到时候“会有人来指定”。
控制器对象用来管理应用程序,它负责视图对象和数据模型对象之间的联系与同步,控制着在程序中传递的各种信息流。比如Calculator项目,当用户点击屏幕上的数字按钮以后,数字按钮(View)会把该事件报告给视图控制器(项目中的ViewController类),视图控制器再调用数据模型对象中的方法或属性。当控制器从数据模型对象处获取结果后,再将信息传递给视图对象(ViewController场景中的Label对象),最终通过Label对象更新屏幕上的显示信息。到此为止,MVC之间的简单工作流程就结束了,如图3-1所示。

image

从图3-1中可以看出,控制器对象就像中介一样,左右各联系着视图和数据模型。在日常生活中,我们都比较讨厌中介(尤其是那些频繁给你打电话的房屋中介),那么为什么就不能让视图和数据模型直接联系,非要有个中介呢?道理很简单,面向对象编程的优势之一就是类的可复用。如果去掉控制器这个中介,用户在屏幕上的交互操作都直接由视图对象去操作数据模型对象,那么,视图中势必包含了对数据模型的引用语句(#import)。但是,当我们在其他地方复用该视图类时,又可能会包含进其他的数据模型类。也就是说,复用越多,包含不必要的数据模型类的可能性越大。再有,随着程序代码不断升级和完善,在修改数据模型类(比如添加、删除模型类中的属性和方法)以后,就有可能会对视图调用数据模型产生非常严重的不良影响,为应用程序的运行添加很多不稳定因素。
在使用项目模板创建iOS应用程序时,Xcode已经自动创建了一个控制器类(View-Controller.swift文件中定义的类)。需要清楚的是,大部分的应用程序都会含有多个控制器,因为Calculator项目非常简单,所以只含有一个控制器—ViewController。
项目中ViewController的任务就是当用户点击计算器界面中按钮时,触发目标类中的相关方法,从而得到相应的计算结果。

相关文章
|
4月前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
109 1
|
5月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
157 3
|
18天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
38 9
|
1月前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
2月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
3月前
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
3月前
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
55 2
|
3月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
46 4
|
2月前
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
84 0
|
3月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。