美文网首页
iOS 00001 MVC模型

iOS 00001 MVC模型

作者: 小白和小黑 | 来源:发表于2015-11-17 04:51 被阅读231次

    前言

    很多人会好奇,为什么会在1之前为什么那么多零,有几个原因.


    第一个原因来自于格拉德威尔在<异类>里面提出的1W小时理论,源自于此但是不止于此,iOS是个很庞大的系统,而且每年都有新的东西,以文章计数,不为凑数而写文章,学以致用;

    第二个原因让自己清醒一下,至少有一件事情我只能算是刚入门,能写出APP的人,但是我不满足于此,在微博关注了很多大牛确实发现有很多需要进步学习的地方,Even though I am not smart,但是要拼一下;

    第三个原因,我怕我会像工厂的机器人一样,给自己一点动力,不断冲刺,不断挑战自己,自己其实惰性很高的,所以我现在需要做的就是想尽一切办法刺激我。

    步入正题

    废话不多说,言归正传,其实我有的时候在想怎么学习iOS才是好的学习之道呢,我觉得这个在于自己。今天我首先要去搞定的是一个设计模式--MVC模式.

    貌似MVC模式是一种在我写项目经验的时候都会是第一句话,当你在互联网搜索MVC模式,你会发现很多语言里面都有MVC.

    1.简介

    MVC(模型-视图-控制器)最早是Trygve Reenskaug在1978年提出的,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构.(源自:https://zh.wikipedia.org/wiki/MVC).在各个语言中基本都会发现他的踪影

    2.iOS中的MVC模式

    在iOS里面最出名的MVC模式讲述应该是下面的一张图,俗称白胡子教授MVC.


    image


    再说明三者关系之前,我们先关注图中MVC之间的六条线,基本上和交通规则是一样的,虚线可以跨越,而实现不能越过.那双黄线呢,更加不能跨越,而且很像中国的那道家里和邻居之间的那道墙,关系恶劣到谁都不能越过.

    当我看到这个模型的第一瞬间,我就觉得这很像三个外星人在交流沟通.先说说最简单的模型(Model),他的上面有一个发射电波的东西,难道是要呼唤外星人吗?因为他的周围都被挡住了,他不能直接和控制器(Controller)沟通的,但是它是负责仓库的得告诉Controller该怎么存储,它想到一个办法就是通过Notification&KVO的方式去告之.Model永远不和View通讯.

    打了这么多汉字,可能你已经看蒙圈了.IT工程师吗,都是一个想法:用代码改变世界.上代码

    Objective-C 代码

    //register notication
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(methodName) name:@"kBackNotication" object:nil];
      
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"小明" forKey:@"name"];
        
    //post notication
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kBackNotication" object:nil userInfo:userInfo];
        
    //remove notication
    [[NSNotificationCenter defaultCenter] removeObserver:self];  
        }
        
    //Handle notication todo sth.
    - (void)methodName{
         //to do sth.
     }
    

    Swift 代码

    let eBackNotication = "eBackNotication"
    //注册通知
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "doSTH", name: eBackNotication, object: nil)
    
    let userInfo : Dictionary = ["name":"小明"]
    //发送通知
    NSNotificationCenter.defaultCenter().postNotificationName(eBackNotication, object: nil, userInfo: userInfo)
    //移除通知
    NSNotificationCenter.defaultCenter().removeObserver(self)
    

    是不是很简单呢,再来看View和Controller之间的通讯,他们之间的感情的热闹的多.

    <li>View 通过Action Target.像UIButton的事件处理
    <li>View 的delegate,如UITableViewDelegate等
    <li>View 的datasource,如UITableViewDataSource

    其实在View和Controller之间的通讯最能体现MVC的模式核心价值观,通讯的时候你根本不需要知道是哪个Controller,View就可以通讯了,瞬间达到解耦合的目的.

    Controller是最大的BOSS,它可以访问View,也可以访问Model.对于Model的访问,它直接强制使用.而使用view的会体现在IBOutlet.

    但是我在实际开发会发现,Controller会变得很臃肿,其实你从图中也能看到这个问题,而发明MVC的设计模式的目的就是减少依赖,解耦合.但是让Controller变的臃肿也不是设计者想看到的,我们改如何处理呢?很大的疑问就产生了.

    下次话题

    互联网能让你很快的进步, 这取决你怎么使用这个产品.在互联网的帮助下,找到了解决的方法,就是MVVM,初见这个词语,你会觉得怎么好熟悉的感觉,没错,你的直觉是对的,就是从MVC继续把Controller拆解开来,解决臃肿的问题,那如何解决臃肿的问题呢?请听下回分解.

    题外话

    我内心一直在想,其实我在写这个系列的iOS文章,可能一开始很多文章是再次总结很多人的文章,自己的思考会很少.我的想法是我要用这种办法开始刺激我思考而不是总在等着技术别人喂给你,也要争取早一天能第一个去尝试新技术,做分享.其实这个是不断进步的步骤,我记得学美术很多都是从临摹开始的,在你临摹的时候不是让你机械的去重复copy,你要去思考.我想用这种模式刺激我思考.也希望建立起来属于我自己的知识体系.

    参考资源

    1、http://blog.devtang.com/blog/2012/02/05/mvc-in-ios-develop/ 唐巧这篇文章还让我学到了一些其它技巧,很受用.

    2、https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html#//apple_ref/doc/uid/TP40010810-CH14-SW1 虽然我没使用这篇文章,但是苹果的文档价值确实很高.

    相关文章

      网友评论

          本文标题:iOS 00001 MVC模型

          本文链接:https://www.haomeiwen.com/subject/vynkhttx.html