《iOS App开发的那些事儿》系列文章从更宏观的角度出发,不仅仅局限于具体某个功能、界面的实现,而是结合网易云信iOS端研发负责人多年的经验,从如何优化现有代码的角度出发,深度分析如何创造出iOS App开发中比较合适的规范和框架。

推荐阅读

iOS App开发的那些事儿1:如何建立合适的规范

一个合适的框架不是银弹,在我看来框架要解决的问题从来不是:有了框架之后,工程就能无比正确地进行下去。好的框架能够做到的事仅仅只是:降低通用问题的复杂度和减少发生错误的可能性。个人认为一个良好iOS App框架应该是有如下特点:

定义清晰的层次结构

l 横向上,各模块互相独立,仅通过有限的几个接口进行通讯。最理想的状态是除核心模块外,其他模块都是可拔插。纵向上,各层次间依赖关系清晰,基本不出现逆向依赖的情况。

l 横向模块一般依赖于业务需求,常被定义成各种Service或Manager。一种好的做法是有个统一的Service管理器负责相应Serivce的加载,卸载,监听和分发App级别的通知给相应Service,如前后台切换,收到内存警告等。这样做一方面容易实现上面说的模块的可插拔化,另一方面也保证了公用特性处理的一致性。在这方面微信就做得不错,基本所有的模块都是从MMService继承而来,由MMServiceCenter进行管理。当然从dump出来的头文件也可以发现一些管理上的紊乱,比如一些ViewController都是继承自MMService。

l 纵向的层次划分基本各个App不会有太大区别,一般可以分为三个层次:

展现层(Presentation layer),负责管理UI和UIViewController。

逻辑层(Business/Service Layer),负责逻辑数据的定义和转发,起到承上启下的作用。

数据访问层(Data Access Layer),负责具体API构造,网络请求,数据持久化等。

各层根据业务逻辑的复杂性内部又会使用单层或者多层结构。以数据访问层为例,一般又可以细分为网络层,持久化层。而一般而言,展现层(UIView和UIViewController)都是直接使用逻辑层提供的Model进行展现,但是某些场景下往往需要不同的Model有相同的界面展示(如我们的App易信中,会话界面,收藏界面,问一问功能都需要进行图片的展现,但这三个模块下的Model定义并不一致),这就需要增加额外的ViewModel层用于粘合展现层和逻辑Model。

遵守SOLID原则和慎用各种设计模式

这是个老生常谈的话题了,并不是iOS开发独有,展开讲可以讲上几天几夜,不赘述。

定义自己的UI基类:UIView,UIViewController,UITableviewCell

这一点的好处不言而喻,所有的子View,Controller,Cell都能够很方便的继承基类的共有的行为,样式。但也会引进很大的管理风险:组内成员总会经不起诱惑往基类塞各种并不普适的特性,引起基类权责的无限膨胀。大基类不仅增加组内成员对代码的理解难度,同时也增加出现问题时的排查难度。从这方面讲,微信的UIViewController基类设计就极端失败:MMUIViewController这个类光头文件就有上百行。

提供方便好用的工具类

一些好用的工具类往往会成为框架重要的有机组成部分,方便快捷地解决局部问题,同时又不引入过多的复杂度。NSTimer的retain cycle是个很容易掉去的坑,那么提供一个基于Block或者weak delegate的NSTimer的封装就是不错的选择。使用KVO容易发生add和remove的不配对调用,那么就引入THObserversAndBinders或者FB的KVOContorller。某些核心模块需要被多个模块依赖时,引入类似XMPP的GCDMulticastDelegate就能够方便地进行解耦。

好的范例

在前几年使用C++的那段暗无天日的日子里,我常想的一个问题是:如何在API层面去限制和规避一些错误。比如往线程池里面扔的task必须是堆上分配的对象,那么如何去强制传入的指针指向的是堆地址而不是栈地址呢?这种傻问题大部分情况下是无解的,有时候有解却是个异常别扭的解。而现在我更相信破窗理论所提供的可能性:做好示范,接下来的一切都会水到渠成。

大家可以戳 iOS App开发的那些事儿1:如何建立合适的规范 回顾该系列第一篇文章,也欢迎大家积极发表自己的看法,与我们共同讨论。

转载于:https://www.cnblogs.com/wangyiyunxin/p/9241627.html

iOS App开发的那些事儿2:如何搭建合适的框架相关推荐

  1. iOS App开发的那些事儿1:如何建立合适的规范

    <iOS App开发的那些事儿>系列文章从更宏观的角度出发,不仅仅局限于具体某个功能.界面的实现,而是结合网易云信iOS端研发负责人多年的经验,从如何优化现有代码的角度出发,深度分析如何创 ...

  2. 项望烽:iOS App开发的那些事儿

    作者:项望烽 毕业于浙江大学 网易云信 iOS端研发负责人 自从做了Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能.界面的实现,而是如何在现有代码的基础上做渐进式的改 ...

  3. 物联网APP开源框架教程(二)—— iOS APP开发

    如何使用核心模块开发设备控制功能(iOS APP开发) 导读:本次教程我们在开源框架代码基础上做一个控制gokit红灯开的App,Wi-Fi设备接入机智云客户端调试工具包括 iOS Demo 和And ...

  4. ios App开发的基本流程

    对于苹果App开发,客户都会选择定制开发,价格贵但鞋子是否合脚只有自己知道.买个实用和放心的产品总比抱个免费没用的东西回家要好得多.iOS App软件开发的基本流程比较简单,只是需要注意一些小的细节, ...

  5. 收集各种 iOS App 开发可以用到的代码示例

    code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例  cocoacontrols.com/ 英文版本的lib收集  objclibs.com/ 精品lib的收集网站 ...

  6. IOS APP开发:苹果app从开发到上架教程详解

    不少人认为按照目前市场占有率,app开发还是以安卓为主,但不可忽视的是, ios app开发的用户基础还是很庞大的,用户需求也很稳定,市场挖掘潜力还是很客观,进行苹果app开发还是存在很大优势的.今天 ...

  7. iOS APP开发工具

    强大的iOS APP开发必备工具.做iOS APP开发的怎么能不知道这些,iOS APP开发必备工具,需要的速来拿! 1.ShareSDK   功能强大.简单易用的iOS app开发必备社会化分享类库 ...

  8. iOS App开发那些事:如何选择合适的人、规范和框架?

    话大道理,笑话小说,小白兔的笑话,小学生笑话大全,开心小笑话,小学生幽默笑话,小明系列冷笑话,小白兔笑话,笑话小故事,小明冷笑话大全,经典小笑话 合适的人 首 先明确一点,合适的人是指纯技术团队的建设 ...

  9. iOS APP开发技术支持

    苹果APP开发技术支持 iOS program design & system consultation if you have any question, please contact me ...

最新文章

  1. 聊天机器人落地及进阶实战 | 公开课速记
  2. java中String xx xx_Java 9 紧凑String改进[JEP 254]Java9新特性
  3. vector 结构体类型 使用 排序
  4. html标记表示超链接,HTML常见标签学习
  5. win7中怎么创建宽带连接
  6. python和对象复习_面向对象阶段复习
  7. 源码都没调试过,怎么能说熟悉 redis 呢?
  8. html宽度满屏,宽度满屏的代码怎么样写?
  9. 边境线 详解(C++)
  10. 解决:fatal error: opencv2/xfeatures2d.hpp: No such file or directory
  11. Uiautomator 2.0之UiObject2类学习小记
  12. 微信小程序如何实现点击链接跳转到手机自带浏览器
  13. 深入解析内存原理:DRAM的基本原理
  14. 字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?
  15. PS 学习笔记 09-吸管工具组
  16. EXCEL表格-根据身份证号计算性别、年龄(IF、MOD函数)
  17. DialogBox函数参数
  18. 5种网络隔离后的文件交换方式,哪种最安全便捷?
  19. 利用计算机考试电影,2016职称计算机考试PowerPoint练习题及答案
  20. 2018东北大学计算机考研专业课,东大考研辅导班:东北大学2018年计算机技术考研上岸经验分享...

热门文章

  1. 将mysql日期格式转换_如何将日期时间格式转换为mysql日期格式?
  2. esp32 蓝牙启动流程_TWS真无线蓝牙耳机多功能测试设备
  3. 使用CoordinatorLayout打造一个炫酷的详情页
  4. StringUtil中常用的方法
  5. 添加cacti监控_小水谈监控---Cacti安装(监控)
  6. 始化mysql系统库_安装和初始化mysql-8.0.11-winx64
  7. Linux的系统启动流程
  8. Netty详解(五):Netty TCP粘包 拆包
  9. mysql按照datetime精确查询_MySQL datetime字段查询按小时:分钟排序
  10. 接口超时后程序还会继续执行嘛_答网友问:分析一段STL程序,并就如何读懂一段程序谈几点感想...