美文网首页我的iOS开发小屋iOS资料iOS零碎知识
斯坦福大学iOS开发公开课总结(一) :iOS的MVC框架

斯坦福大学iOS开发公开课总结(一) :iOS的MVC框架

作者: J_Knight_ | 来源:发表于2016-06-19 16:07 被阅读2100次

    写在开头


    入职iOS开发也有半年了,一直没有积极更新技术博客,感到甚是惭愧。虽然这期斯坦福公开课内容相对基础一些,但是笔者还是想把每一课的内容都总结一下然后分享出去,也算是对自己的锻炼以及对这一经典的课程致敬吧。

    课程地址:斯坦福大学公开课:iOS 7应用开发

    废话少说,开始!

    MVC架构介绍


    基本概念:

    • 视图(View):构建UI的类;例如:按钮,标签,进度条等。
    • 模型(Model):视图类所需要的数据;例如:表格需要显示的文字。
    • 控制器(Controller):连接视图类和模型类,任务是使数据显示在屏幕上。例如:控制器将表格需要使用的数据“填入”表格视图中,将表格视图显示出来。

    通信方式

    • 控制器可以直接访问模型:将模型直接作为控制器的属性。

    • 控制器可以直接访问视图:将视图直接作为控制器的属性。

    • 模型与视图无法直接访问对方:二者完全解耦,不能引用对方,把对方设置为属性。

    • 视图到控制器的通信

      1. 目标动作机制(target - action):用户与视图交互触发控制器的方法。例如:点击按钮后实现视界面跳转,网络请求,刷新UI等。

      2. 委托机制(delegate):视图向控制器询问某些自己无法决定的事情,或是让控制器帮助自己做一些自己独立无法完成的事情。 因为控制器才是掌握全局的角色,很多时候视图是无法自己做决定的。例如:表格问控制器:我可以滚动么?然后控制器给予回答告知是否可以继续滚动。 如果表格的高度很小,那么就可以不让它滚动。但是如果表格的高度已经超过了屏幕的高度,这时候如果让它自作主张无法滚动久不好了。

      3. 数据源机制(dataSource):视图让控制器给它将要显示的数据。例如:音乐的数据存在于模型里,控制器访问模型,从模型里拿到数据后告诉视图如何显示出歌曲。

    • 模型到控制器的通信

      1. 广播机制(Notification):控制器注册监听某模型数据变化的广播频道,当此模型数据变化后向该控制器发送广播,告知模型变化情况。
      2. KVO机制(Key-Value Observing):模型作为控制器的属性,当模型属性被修改后,持有此模型属性的控制器就会收到通知。

    下面一张图可以直观看出上述的通信方式。图片来自本课程配套的课件

    iOS MVC架构

    其他知识


    类文件类型:

    • .h文件(头文件):公开API,其他类可以调用的方法,告诉其他类“我能做些什么:what I can do
    • .m文件(实现文件):非公开API,如何实现.h文件的方法,查看实现文件可以知道该类具体是如何实现公开API的方法的:how to do

    属性

    • strong:在堆中保持这个所指的东西,至少有一个强指针指向它,否则就会释放。
    • weak:如果没有强指针指向它,清理指向的内存后,会被设置成nil指针。
    • nonatomic:不能有两个线程同时设置该属性。

    零散知识

    • 所有对象都在堆里,OC会为我们管理这些内存。
    • 访问实例变量,就是访问对象的实例数据。
    • OC里,可以先实现方法再声明。

    结语


    第一讲里的内容比较基础,重点是介绍了MVC模型的通信机制,需要反复推敲并且在实际操作中严格遵守。因为只有这样做才能降低类之间的耦合性,写出易于维护和扩展的代码。

    比如在模型类里是不能调用控制器的方法的,模型类只能被控制器调用并且当所拥有的数据改变后通知使用自己的控制器数据的改变。更不能直接给视图通知让视图自己更新UI。

    本文已在版权印备案,如需转载请访问版权印。48422928

    获取授权

    相关文章

      网友评论

      • SHY圆圆圈圈圆圆:2012年看这个入门。现在觉得 特别经典。
        J_Knight_:@SHY圆圆圈圈圆圆 厉害了~
        SHY圆圆圈圈圆圆:@J_Knight_ 并不是,本科期间一个项目要用,就自己学了一个暑假。当时还没有中文字幕。
        J_Knight_:@SHY圆圆圈圈圆圆 厉害了 前辈啊
      • 洁简:你自学iOS是看书还是视频还是其他方式。
        J_Knight_:@洁简 慕课网,有的时候偶尔看看李明杰老师的,查缺补漏。现在主要还是看源码
        洁简:@J_Knight 恩,视频一般在哪看哪方面的视频呢?
        J_Knight_:@洁简 开始的时候看书,再后来看视频,再后来看别人的框架。但是不是完全不同步的,现在只是不怎么看书了,视频和源码还是看的。
      • 6988cf2af3a0:模型到视图控制器也可以用委托的吧?委托就是协议代理。适用于几乎一切的类与类间的通信。只是建立方式比消息或是kvo较为繁琐。
        J_Knight_:@justindigix 嗯嗯 你说得对。不用谢~ 还需多指点 :smile:
        6988cf2af3a0:@Hero_SJ 我觉得是iOS的model-controller的通信模式决定了delegate不适用。因为这两层间通信模式太简单。不像vc层有如此多的动态和交互逻辑。例如,tableview的交互操作使用delegate就会好很多。此外很多ui类的delegate的方法其实也证明了这点。所以我觉得主要还是委托模式相对比较重。基本上NSNotification 1、2句话做好的事儿,kvo需要3/4句话,委托代理就要改6、7处。但是对于复杂的VC层间通信,委托的威力就展示出来了!另外我觉得委托的根本是不同类间的继承和重用,而不是字面意义上的把麻烦事儿给其他类去做。iOS中的多继承就靠委托了。非常感谢你的文章,我接着继续学习!:smile:
        J_Knight_:@justindigix 理论上是可以用委托的。但是我们需要想一下委托的使用意义:是让某些类做自己擅长的任务,将其他繁琐的任务交给代理来做。这想的话,如果让视图控制器作为模型的代理显然是不合理的,因为二者并不是这样的关系。反之,模型的变化是要“告诉”控制器的,也就是使用观察者模式:控制器观察模型的变化。因此在这里,使用通知或者KVO更好一些。其实我们不应该只追求达成某一种目的,而是说要具体问题具体分析。解决问题可以有很多方式,我们应该使用最贴切,最正确的解决方案。
      • c96ca2a17d23:关注一波,iOS开发在长沙
        J_Knight_:@老倌子 加油~
      • 5b726ed578ce:学长 『OC里,可以先实现方法再声明。』这句话可以举个实例吗??
        5b726ed578ce:@Hero_SJ 嗯呐 这我就理解了 thx
        J_Knight_:@Marshall_Chou 这里的声明应该是调用的意思,也就是说在实现文件里,你可以先调用某个方法,然后在下面实现它。
      • 480a4933fcba:视频在哪里看的,亲:bow:
        J_Knight_:@寻己1994 网易公开课呀:http://open.163.com/movie/2014/1/M/7/M9H7S9F1H_M9H7TMJM7.html
      • 郑明明:总结的很不错啊,看到你一直在总结,关注你一波,顺便学习下斯坦福iOS哈哈
        J_Knight_:@nineteen__ 谢谢呀 已经更新到第十课啦
        郑明明:嘿嘿,加油!
        J_Knight_:@nineteen__ 嗯嗯 最近公司不是很忙 比较有时间,争取一气呵成拿下它
      • 小小Q吖:已经看完了 :wink:
        J_Knight_:@就是拽嘿嘿 哈哈 好
      • 小小Q吖: :blush: 不错的
        J_Knight_:谢谢哈 会一直更新呢 第二篇已经发布了:smile:

      本文标题:斯坦福大学iOS开发公开课总结(一) :iOS的MVC框架

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