在前面几篇文章中,我们大致研究了一下,在Android平台,以应用开始时的Splash页面为例,讲述了怎样利用MVC架构来实现这一简单功能,有可能有朋友认为,对于这样简单的功能,采用MVC架构有些过了。但是,如果需求变为,需要根据时间、地点等,显示从服务器上下载的图片,那么我们所采用的架构,就具有一定的优势了。
下面,我们将讲述在IOS平台怎样实现相同的功能。我们知道在IOS平台上开发原生应用,有两种技术可供选择,即Objective-C或Swift。如果对于找工作而言,当前最好的选择依然是Objective-C,原因很简单,目前国内多数公司仍然使用Objective-C进行IOS开发。但是,如果我们做自己的项目的话,我推荐采用Swift,一方面,Swift作为苹果主推的新一代语言,迟早会成为主流;另一方面,同样的功能,Swift实现代码更少,更不容易出错,开发速度更快。因此,在这个系列中,我将以Swift作为IOS的开发语言。在余下的几篇博文中,我将采用Swift开发与Android相同的功能,分别介绍如下内容:IOS平台下MVC架构,Swift语言快速入门、Splash实现。
在开发应用中,我们希望降低系统间耦合,将控制和显示相分离,因此我们通常采用MVC架构。将应用按照控制器、视图、模型来组织,使系统的耦合减少,灵活性增加,更方便于调试和维护。
但是在IOS平台中,系统同样并不强制开发人员采用特定的架构。通常程序员们会觉得IOS平台所有组件都是基于MVC的,我的应用自然就是基于MVC架构的呀!其实这是一种典型的错解,IOS组件是基于MVC的不假,但是你的程序在IOS中既保存着从网络获取到的数据,又负责页面更新和显示,同时还有业务逻辑,我时程序员通常将这些功能都添加到ViewController中。但是,从ViewController的名字可以看出,其是View和controller的结合体,将Moel数据也放入其中,显然是不合适的。
IOS平台下,MVC架构图如下所示:
对于IOS平台而言,尤其是Swift语言,其实设计者虽然没有指名采用什么应用架构,但是在构建系统时,显然是以MVC为指导思想的。在IOS平台中,我们首先遇到的是UIViewController的子类,这在MVC架构基本等价于控制器(Controller),但是与标准的MVC架构有所不同,在ViewController中,实际上结合部分视图(View)的功能。如上图所示,视图中的所有控件,通过绑定IBOutlet获取控件所对应的变量,这样ViewController从模型中取出数据后,可以通过这些IBOutlet属性,根据数据内容操纵视图(View)将这些数据显示到界面上。当用户在界面中进行交互时,会产生事件,通过绑定的IBAction,可以调用ViewController中对应的事件处理函数,实现对事件的正确响应。
在IOS平台中,视图(View)根据实现方式不同,可能有几种不同的情形。第一种方式下,采用XCode推荐使用的SotryBoard,在这种方式下,视图(View)对应着在StoryBoard中的场景。第二种情况,在应用页面较多的情况下,多数人并不使用StoryBoard,而是创建ViewController的同时创建对应的XIB文件,这时XIB就对应于视图(View)。第三种情况,由于在界面上操作Autolayout和Size是比较麻烦的,而且有一些复杂的情况,仅通过界面是无法实现的,因此实际中,有很多开发人员,直接采用代码来写界面,这时就有了真正的视图(View)类。对各人而言,我比较倾向于第三种方案。在自己实现视图(View)类时,可以直接从模型中取出数据并显示,这也是标准MVC架构的情形,但是为了与另外两种情况兼容,我们仍然采用视图(View)中不从模型中获取数据,与模型(Model)类无任何交互。
在IOS平台中,模型类一般都是自定义的类。当ViewController需要数据时,会调用模型(Model)的相应方法获取数据。当模型数据改变时,模型(Model)不主动调用ViewController。在Swift语言中,通过对属性添加willSet / didSet函数,当属性值发生改变时,会触发这些方法,我些方法会生成对应的事件,并发送到消息总线上去。ViewController对各种感兴趣的消息进行注册,通过Observer模式,实现对特定消息的响应。
以上就是在IOS平台下,MVC架构的基本描述。在下一篇博文中,我将以程序开始时的Splash页面为例,采用Swift来实现这一功能。
华丽的分隔线
******************************************************************************************************************************************************************************
希望大家多支持,有大家的支持,我才能走得更远,谢谢!
银行账号:622202 0200 1078 56128 闫涛
我的支付宝:[email protected]