1.MVVM浅析

MVC是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式,市面上大部分App都是这样构建的,具体组织模式不细说,iOS入门者都比较了解(虽然不一定能完全去遵守),但其几个不能避免的问题却是很严重困扰开发者,比如厚重的ViewControlller、遗失的网络逻辑(没有属于它的位置)、较差的可测试性等。因此也就会有维护性很强、耦合性很低的一种新架构MVVM(MVC引申出的最新架构)的流行。

MVVM虽然来自微软,但是不应该反对它,它正式规范了视图和控制器紧耦合的性质,如下图:

                    MVVM图示

ViewModel:相比较于MVC新引入的视图模型。是视图显示逻辑,验证逻辑、网络请求等存放的地方,唯一要注意的是,任何视图本身的引用都不应该放在VM中,换句话说,就是VM中不要引入UIKit.h(对于Image这个,也有人将其看做数据来处理,这就看个人想法了,并不影响整体的架构)。

这样,首先解决了VC臃肿的问题,将逻辑代码、网络请求等都写入了VM中,然后又由于VM中包含了所有的展示逻辑而且不会引用V,所以它是可以通过编程充分测试的。

ReactiveCocoa是结合了函数式编程和响应式编程的框架,也可以称为函数响应式编程(FRP)框架,强调一点,RAC虽然最大的优点是提供了一个单一的,统一的方法去处理异步的行为,包括delegate方法,blocks回调,target-action机制,notifications和KVO.但是不要简单的只是单纯的认为他仅仅是减少代码复杂度,更好的配合MVVM而已。

它最大的与众不同是提供了一种新的写代码的思维,由于RAC将cocoa中KVO、UIKitEvent,delegate,selector等都增加了RAC支持,所以都不用去做很多跨函数的事。

如果全工程都使用RAC来实现,对已同一个业务逻辑终于可以在同一块代码里完成了,将UI事件,逻辑处理,文件或数据库操作,异步网络请求,UI结果显示,这一大套统统用函数式编程的思路嵌套起来,进入页面时搭建好这所有的关系,用户点击后妥妥的等待这一套联系一个个的按期望的逻辑和次序触发,最后显示给用户。

3.本篇对两者的理解运用

在此次介绍中,会使用MVVM+RAC结合的方式,搞定一个添加上拉加载及下拉刷新的列表,所以更多的诠释MVVM思想,而不是RAC的逻辑链式操作(这一点用登陆界面来写更能体现),RAC在此扮演的更大一部分的角色是更好的解耦,减少代码复杂度,使代码层次分明、逻辑清晰便于维护升级。

二、框架部分

1、框架目录详解

首先介绍一下本框架的目录结构,如下图:

1、Frameworks

存放系统库的虚拟文件夹,目前搭建框架的时候需要手动添加一个名称为Frameworks的虚拟文件夹,这样你在Build phases中添加的系统库会自动归入此文件夹,不会直接在外部显示以至于打乱目录结构。系统库添加流程如下:

细心的会发现此目录中有两个相同的Frameworks,这是为什么?最上面的那个frameworks是在自己搭框架自己添加的,当时项目还很单纯,问题是出在下面那个Pods Target上,添加它之后就会自动给你生成一个旭牛的frameworks的文件夹,那又该问了,为啥不直接用下面那个呢?(两者之间并没有冲突)

2、cocoapods

当开发iOS应用时,会经常用到很多第三方开源类库,比如JSONKIT,AFNetworking等等。可能某个类库又用到其他类库,所以要使用它,必须得下载其他类库,而其他类库又用到其他类库,”子子孙孙无穷尽也“,反正在早期程序员是会体验到这种痛苦,心酸,手动一个个去下载所需类库是十分麻烦的。

还有另外一种情况,项目中用到的类库有更新,必须得重新下载新版本,重新加入到项目中,十分麻烦。

CocoaPods就是帮你解决上面问题的,话说这玩意应该是iOS最常用最有名的类库管理工具了,作为iOS程序员的我们,掌握cocoapods的使用是必不可少的基本技能了。

3、AppDelegate

这个目录下放的是APPDelegate.h(.m)文件,是整个应用的入口文件,所以单独拿出来。一会儿告诉你如何写一个简洁的AppDelegate,会在这个文件夹里添加一些类,所以将其放入一个文件夹内还是很有必要的。

4、Class

工程主体类,日常大部分开发代码均在这里,又细分了好多次级目录。

通用类

·General:通用类(文件夹项目移植过程中都不需要更改,就能直接使用的)

  。Base:基类(整个框架的基类)

  。Categories:公共扩展类(就是一些常用的类别,比如分享啊什么的)

  。Core:公共核心类(一般存放个人信息,接口API等)

  。Models:公共Model(公用的一些数据模型)

  。Views:公共View(封装的一些常用的View)

工具类

  ·Helpers:工程的相关辅助类(比如类似数据请求、表单上传、网络监测等工具类)

宏定义类

  ·Macro : 宏定义类(就是整个应用会用到的宏定义)

    。AppMacro.h app项目的相关宏定义

    。NotificationMacro.h 通知相关的宏定义

    。VendorMacro.h 第三方相关的宏定义

    。UtilsMacro.h 为简化代码的宏定义

    。.......等等

APP具体模块代码类

  ·Sections : 各模块的文件夹(一般而言,我们以人为单位)

    。LWSections 老王的文件夹

    。......等等

每个成员的文件夹下是其所负责模块的文件夹,比如苍老师负责PHP界面模块,如下

·PHP :模块名,也可以是首页(HomePage)...等等

  。ViewControllers 界面控制器存放处(这是文件夹名)

  。ViewModels 打杂的(MVVM的核心、解耦合、处理逻辑等)

  。View 界面相关View存放处(界面相关子View)

  。Models 数据模型存放处(各种单纯的数据模型,一点都不胖,是标准的瘦Model)

这就是标准的MVVM了

第三方类库

  ·Vendors : 第三方类库/SDK,如UMeng、WeiboSDK、WeixinSDK等等。

刚才的cocoapods确实管理着大部分的第三方库,这里建立第三方库目录原因有两个:其一,并不是所有的你需要的第三方库都支持pods,所以还是需要手动添加一些类库。其二,一些第三方库虽然支持pods,但是需要我们去更改甚至自定义这个第三方,此时也需要放入这里,也防止使用pods一不小心更新掉自定义。

5、Resource

这里放置的是工程所需的一切资源,如下

·Fonts 字体

·Image 图片(当然你可以添加至Assets.xcassets)

·Sounds 声音

·Videos 视频

2、基类详解

这里着重讲解一下VC、V、VM的基类,其他的模式与View类似所以略过,其中TableViewCell的基类稍微特殊所以也提一下。

目前的基类如下图:

曾经笔者感觉基类不顺眼,曾经尝试将基类全部干掉,然后遇到了一些麻烦。

[HMLY]7.iOS MVVM+RAC 从框架到实战的更多相关文章

  1. iOS MVVM+RAC 从基础到demo

    一.关于经典模式MVC的简介 MVC是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式,市面上大部分App都是这样构建的,具体组建模式不细说,iOS入门者都比较了解(虽然不一定能完 ...

  2. 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

    上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...

  3. iOS开发 MVVM+RAC 的使用

    好长一段时间没有敲简书了! 主要是因为一直在跑面试. 终于还是在上海入职了! 由于项目原因最终还是入了MVVM+RAC的坑 下面是正题. Demo效果 使用MVVM+RAC请求网络数据 Reactiv ...

  4. iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇

    完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...

  5. 【转】iOS超全开源框架、项目和学习资料汇总

    iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...

  6. iOS引入JavaScriptCore引擎框架(二)

    为何放弃第一种方案 UIWebView的JSContext获取     上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebVi ...

  7. IOS 中的CoreImage框架

    IOS 中的CoreImage框架(framework) - time4cnblogs 时间 2014-03-15 00:24:00  博客园-所有随笔区原文  http://www.cnblogs. ...

  8. iOS - MVVM 架构模式

    1.MVVM 从字面意思来理解,MVVM 即 Modal View ViewModel(模型 视图 视图模型).MVC 是一个用来组织代码的权威范式,也是构建 iOS App 的标准模式.Apple ...

  9. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

随机推荐

  1. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

  2. Idea构建Maven项目教程

    Idea构建Maven项目,以及其中遇到的坑,及解决方案 步骤一:配置Idea的maven插件 步骤二:创建maven项目 file-->new-->project 下一步,设置group ...

  3. Orchard学习

      Data Source=.\SQLEXPRESS;Initial Catalog=Arale;Integrated Security=True;

  4. 一个HttpWebRequest工具类

      using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.N ...

  5. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三

    本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...

  6. 寻找最大的k个数

    这个题目是非常经典的一个题目,解法也有很多,现在就把我已经理解的解法记录下来. 题目描述 有n个无序的数,它们各不相等,怎样选出其中的最大的k个数呢? 题目分析: 解法1: 最容易想到的就是把n个数进 ...

  7. Changing the working directory of VIM

    Sometimes we want to open another file in the same folder with current editing file, what we can do ...

  8. CSS3/jQuery自定义弹出窗口

    简单演示一下,精简了演示效果和css样式文件,更利于在项目中的实际应用 引入style.css   index.js <!DOCTYPE HTML PUBLIC "-//W3C//DT ...

  9. javascript遍历select下拉框判断其中值是否与指定值相等

    用jquery多了,就忘了原生的js是如何写的了,还需要多加巩固. 需求:jsp回显一select下拉框.选中指定值. 用户点击修改 该select进行已有值回显.有两种解决方法 一.js中获取用户的 ...

  10. [原创*精华]一键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来...

          重要更新:鉴于很多小伙伴们说看不到图,我这边换了几个浏览器看了下,都看得到的,估计是网速问题,请耐心等待,另外,为了更好的方便大家学习,特此提供源码以及一个word文档,word文档就是本 ...