- iOS中MVC等设计模式详解
-
-
在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来。(事实证明这是值得的!)
模型-视图-控制器(MVC)设计模式是被大家广为熟悉和使用的模式,实际上在移动开发中尤其ios开发中,这种模式被发挥到淋漓尽致
- MVC设计模式包括三个部分:模型、视图和控制器。
- 模型包含数据、信息,逻辑,或对象被认为是部分的业务层的iOS应用。
- 视图包含所有的用户信息的组件,如文本区域,按钮,滑块,被认为是表示层的一个iOS应用。
- 控制器是联络,或通信层,一个iOS应用。一个模型将永远不会直接沟通一个视图,反之亦然。 控制器连接模型视图处理所有通信。
-
用户行为发生在一个视图,比如一个按钮点击。 视图将消息发送给控制器。 如果有必要,控制器与模型。 控制器通过信息返回到视图。 使用一个假想的计算器应用程序作为一个例子,MVC设计模式将应用如下:
- 模型——计算功能(加、减、乘、除)。
- 视图——用户界面组件(操作数和操作符按钮、计算文本)。
- 控制器——对象,倾听和沟通信息模型和视图。 当平等的按钮被选中时,例如,控制器使请求模型执行数学。 该模型返回答案到控制器,它及时沟通结果视图。 视图负责显示答案。
- MVC是一个好的设计任何iOS应用程序或Mac应用程序的核心。采用这种模式的好处是多方面的。很多在这些应用程序中的对象往往是可重复使用的,往往得到更好的界定及其接口。MVC设计的应用程序,也更容易比其他应用程序进行扩展。此外,您的应用程序可以使用的许多技术和架构是基于MVC和要求您的自定义对象扮演一个MVC的角色。
-
您可能没有意识到这一点,但你已经创建了一个应用程序,是基于MVC:在你的iOS应用的HelloWorld。的模型对象是
用户名
物业(NSString的
对象)宣派及管理HelloWorldViewController
类的。的HelloWorldViewController
和HelloWorldAppDelegate
类的实例应用程序的控制器对象的应用程序的视图对象的文本字段,标签,按钮,背景图。模型-视图-控制器的完整信息“模型-视图-控制器”的概念在Objective-C编程。
模型对象
模型对象封装了一个应用程序定义的数据操作和处理数据的逻辑和计算。例如,一个模型对象可能代表一个字符,在游戏或在地址簿中的联系人。有时,一个应用程序的模型层实际上是一个或多个图形相关的对象。大部分的数据,部分应用程序的持久状态(是否持久化状态存储在文件或数据库)应驻留在数据加载到应用程序的模型对象后。因为模型对象代表到一个特定的问题域相关的知识和专长,他们可以重复使用在类似的问题域。应该有一个“纯粹”的模型对象的视图对象,目前其数据,并允许用户编辑数据,它不应该被关注的用户界面和演示问题没有明确的连接。
在视图层创建或修改数据的用户操作在创建或更新模型对象通过一个控制器对象和结果传达。当一个模型对象的变化(例如,新的接收数据通过网络连接),它会通知控制器对象,更新相应的视图对象。
查看对象
一个视图对象是在一个应用程序,用户可以看到一个对象。一个视图对象知道如何绘制自己可能会响应用户的操作。视图对象的一个??主要目的是显示数据从应用程序的模型对象,可以使编辑该数据。尽管如此,在一个MVC应用程序的视图对象模型对象通常脱钩。
因为你通常重用视图对象,对其进行重新配置,视图对象提供应用程序之间的一致性。对于iOS上,UIKit框架提供了视图类的集合;为OS X AppKit的框架提供了一个类似的集合。UIKit的视图对象
的UIView
类;最终继承了AppKit,它最终继承自NSView的
类。视图对象通过应用程序的控制器对象模型数据的变化,并了解用户发起的变化,例如,文本的文本字段中输入通过控制器对象应用程序的模型对象沟通。
控制器对象
控制器对象作为一个或多个应用程序的视图对象和一个或多个模型对象之间的中介。因此,控制器对象视图对象的管道了解变化的模型对象,反之亦然。控制器对象也可以执行一个应用程序的安装和协调的任务和其他对象的生命周期管理。
控制器对象解释用户视图对象中的行动和新的或更改的数据模型层。当模型对象的变化,控制器对象通信,新的模型数据的视图对象,使他们能够显示它。
设计模式解决问题
面向对象的系统,作为一个应用程序是动态的。一个对象可以在运行时并不限定于在编译时设置的行为。一个对象可以发送邮件到其他对象,并可以有所不同运行情况下的目标相同的消息。一个对象也可以与其他对象的一个??变量组在运行时,使用了多种技术,可以有效地完成工作的应用程序。对于一个对象,或对象的网络,做到这一点,它必须利用许多技术和框架体系结构的设计模式是适应的。
以下各节描述了许多这些技术和架构。考虑他们的Objective-C编程工具包的一部分。
代表团:代理代表另一个对象
代表团,一个对象调用代表的委托行为,并要求另一个对象。其他,委派,对象通常是一个框架对象。在一些点在执行时,它发送一个消息到其委托的消息告诉一些事件即将发生的委托,并要求一些回应。委托(通常是一个自定义类的一个实例)实现调用的方法的消息,并返回一个适当的值。通常情况下,该值是一个布尔值,告诉委托对象是否继续进行的动作。
-
因此,代表团是一个框架的运作注入特定于应用程序的行为的一种手段,无需子类类类。它是一种常见的和强大的设计延伸和影响的行为框架。
回想的
HelloWorldAppDelegate
对象的HelloWorld应用程序时创建工作通过你的第一个iOS应用。Xcode的自动分配,它是应用程序对象的委托,这是一个框架对象。应用程序委托可以处理应用:的didFinishLaunchingWithOptions:
和其他代表团的消息发送给它的应用程序对象。有两个纲领性组件代表团。委托类必须定义一个属性(按照惯例,名为
委托
)委托持有的参考。它也必须声明一个协议,必须采取委托类(请参阅下面的部分协议)。很多类的Cocoa Touch和Cocoa框架提供的代表团作为一种方法,应用程序与特定应用程序的东西,是可以采取增加框架的行为。但是,代表团并不限于框架类。您可以实现在一个应用程序的两个自定义对象之间的代表团。在可可触摸应用程序使用一种常见的设计代表团允许子视图控制器进行通信其父视图控制器的一些值(通常是用户输入的值)的一种手段。
协议:启用通信对象之间的继承关系
协议是一声明的程序接口的方法,任何类都可以实现。与协议相关联的类的实例调用的方法的协议,并获得返回值类正式通过和实施该协议。这一个具体的目标,如解析XML的代码或复制对象,对象之间的沟通,进一步加强。协议接口的任一侧上的对象可以被遥远地相互关联的,通过继承。因此协议是,代表团,子类化的替代,往往是一个框架的实施代表团的一部分。
-
苹果提供的框架申报几十协议。此外,您的应用程序可以声明你的类可以采用自定义协议。协议是你的编程工具包的一部分。与Objective-C语言编程,给出了一个全面的协议描述。
通知中心:通知有关观察员事件
Foundation框架的通知中心是一个子系统,广播消息通知到一个应用程序中的所有对象注册事件的观察员。(以编程方式,这是一个
NSNotificationCenter
类的实例。)事件可以发生在任何一个应用程序的应用程序进入背景状态,例如,或用户开始键入的文本字段中。一个通知,通知该事件已发生或即将发生的观察员,从而使观察者以适当的方式回应的机会。通知中心的广播通知是一种方法来增加一个应用程序对象之间的合作和凝聚力。 -
例如,在iOS应用程序的视图控制器可以观察的通知
UIKeyboardWillShowNotification
调整其视图的几何形状,以适应虚拟键盘。这个例子表明,通知是一个对象,它有一个名字,表明一个特定的事件,该事件是否已经发生或即将发生。它还带有一个参考对象的职位(或发送)的通知,通知中心,它可以包含一个字典的补充资料。任何对象都可以观察到一个通知,但这样做的,它必须注册后才能收到它。在注册时,必须指定一个选择,确定要调用的方法的交付通知,方法的签名必须有一个参数:通知对象。注册时,观察者也可以指定发布对象。
通知中心通知代表团消息被发送到任意对象的特定事件发生时。但是,处理通知的方法,委派方法不同,不能返回一个值。通过通知中心的通知是同步的,就像代表团。
在您的应用程序的自定义对象可以定义和发布自己的通知,以及其他定制的对象在你的应用程序中,可以观察到通知。
目标行动:当事件发生时要发送的消息封装
targer-action设计的概念很简单。对象存储的元素,使讯息表达,当某个事件发生时,把这些元素组合在一起,并发送一条消息。的元素是吞吐量的消息(action),接收该消息的对象(target)的一个选择器。目标的类方法实现了相应的行动和目标,当它接收到的消息,在运行时,它响应此事件的执行方法。
target-action主要是控制在Cocoa Touch和Cocoa框架的一个特点。控件是一个用户界面对象,如按钮,滑块,或切换用户操作(通过点击,拖动,等等),以表示它们打算到一个应用程序。Cocoa Touch控制存储的行动和目标都搭配一个或多个单元格对象存储目标和行动,大多数Cocoa Touch。
- 一些框架使用target-action控制以外的对象。例如,UIKit框架使用目标的行动,在其设计的手势识别。当一个手势识别对象识别手势,动作消息发送到目标对象。
-
键 – 值观察:当一个值发生变化时通知观察员
键 – 值观察允许一个对象在观察的另一个对象的一个??属性。观察对象时,会通知该属性的值的变化。了解新的值,以及旧的,如果观测到的属性是一个对多的关系(例如,一个数组),它也得知涉及其中所包含的对象中的变化。志愿帮助应用程序变得更有凝聚力,保持对象模型,控制器,查看图层的变化同步。
类似
NSNotificationCenter
通知,多个志愿观察员可以观察到一个单一的财产。此外,KVO是动态的,因为它允许观察的对象,而不需要任何新的API,如通知名称的任意属性。国际志愿者组织是一个轻量级的点至点的通信机制,不允许观察的特定属性的所有实例。基于设计模式的框架设计
CocoaKIt和Cocoa框架还包括其他的设计基于设计模式,包括以下内容:
- 查看层次结构。的意见被安排在一个应用程序提出基于视觉的层次组织遏制。这种模式允许应用对待个人的观点和意见的成分均匀。在层次结构的根是一个窗口对象,每个视图中,根目录下有一个父视图和零个或更多孩子的意见。家长的意见附上孩子的意见。视图层次结构中的结构成分,两者的绘图和事件处理。
- 响应链。响应链是一系列的对象大多意见,也有窗口,视图控制器,本身以及其中的应用对象可以通过事件或动作消息,直到一个链中的对象处理该事件。因此,它是一个合作的事件处理机制。响应链密切相关的视图层次。
- 查看控制器。虽然两者的UIKit和AppKit的框架视图控制器类,他们在iOS中是特别重要的。视图控制器是一种特殊的控制器对象提出意见和管理一组。查看控制器对象提供的基础设施管理内容相关的意见和协调它们的显示和隐藏。视图控制器管理子层次结构的应用程序视图。
- 类别为您提供一种方式来扩展一个类添加方法。与delegate一样,它使您可以自定义行为没有子类。分类是一个Objective-C的功能描述中写Objective-C代码。
-
iOS中MVC等设计模式详解的更多相关文章
-
iOS中线程同步基本详解
为什么使用线程同步技术:多个线程是同时执行的 如果多个线程同时操作一个资源 会造成此资源的数据错乱 线程同步简介 线程同步,多条线程按顺序地访问某个资源 注意:此处的同步不是一起执行的意思 是一个一个 ...
-
IOS中的NSTimer定时器详解
/* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...
-
iOS中 CoreGraphics快速绘图(详解) 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Graph ...
-
iOS中UINavigationController控制器使用详解
一.概述 UINavigationController用来管理视图控制器,在多视图控制器中常用.它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹 ...
-
iOS中--NSArray调用方法详解 (李洪强)
下面的例子以 NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"to ...
-
iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 整体布局如下: 程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang ...
-
IOS中的网络编程详解
在移动互联网时代,几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图,只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力,如果没有了网络,也就缺少了数据变化,无论外观多 ...
-
IOS 中列表的TableView 详解,常用方法整理
一.创建一个列表,不管代码还是nib拖拉,在nib创建的时候,记得加他的二个代理 (UITableViewDelegate UITableViewDataSource) 代码创建的话,需要关联他的代理 ...
-
IOS中UIActionSheet使用方法详解
一.初始化方法 - (instancetype)initWithTitle:(NSString *)title delegate:(id<UIActionSheetDelegate>)de ...
随机推荐
-
以最简单方式学习Linux
有很多关于Linux的书籍,博客.大多数都会比较"粗暴"的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在 ...
-
php 做数学运算时结果为0的原因
php是一种弱类型的脚本语言,一般情况下字符串型的数字可以直接参与运算. 但是当字符串开头是实体空格的时候系统会默认字符串等于0. 此问题比较隐蔽,在此记录下
-
c#缓存介绍(转)
缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 本章从缓存 ...
-
C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
最熟悉的陌生人 作者:张慧桥 “枪与玫瑰” 我送走了“蝶恋花”,犹有一种身在梦中的感觉,昨晚的宿醉让我只觉得头晕乎乎的很不舒服,想想自己连澡都还没洗呢,便去洗了个冷水澡. 煮了杯浓浓的咖啡喝了下去,我 ...
-
NUC_TeamTEST_B(贪心)
B - B Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Statu ...
-
[技巧]实际项目中background-image应写在页面上
摘自:http://www.zhangxinxu.com 因为实际项目中(数据对接时),这肯定是个动态的URL地址,css文件似乎不支持动态URL 地址. <img src="../i ...
-
Server2003安装SP2补丁提示密钥无效的解决方法
机器一直没有打SP2的补丁.几天要安装一个程序,还非要SP2不可.没办法.居然打补丁的时候出现了这样的错误信息: --------------------------- Service Pack 2 ...
-
MHA高可用架构与Atlas读写分离
1.1 MHA简介 1.1.1 MHA软件介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton ...
-
SQL Server 2008作业失败无法确定所有者是否有服务器访问权限
调用作业---错误提示内容 该作业失败. 无法确定所有者 WIN-3TH1KNIT12D\Administrator (拥有作业 Database_Backup.step1)是否有服务器访问权限 (原 ...
-
ES2018新特性(译文)
原文链接:css-tricks.com 第9版ECMAScript标准于2018年6月发布,正式名称为ECMAScript 2018(简称ES2018).从ES2016开始,ECMAScript规范的 ...