自我介绍
你好,我叫徐庆明,15年9月参与葱课团队实习,一直在葱课工作至今年的12月12号。在这个过程中参与过两个项目,葱课和知识传说。葱课是第一个项目,3个人开发,我参与了其中几个重要的功能模块。17年3月,公司iOS开发有我一个人负责。17年6月开始开发知识传说项目,项目由我独立负责开发和维护的,对于iOS客户端开发的整个过程有非常清晰的理解
结构划分: 1,全局模块:全局宏,枚举,颜色,项目中的话术
2,通用模块:
工具类,管理器,分类
3,项目功能模块
4,第三方框架:
第三方框架使用cocoapods引入,再进行一层封装。封装的好处是,在未来的项目中,如果需要更改第三方框架,只需要对封装的一层进行修改即可,项目中使用到三方框架功能的地方不需要进行修改。
5,自定义框架
分页控制器框架(AGPageController)
模块设计: 1,appdelegate进行模块划分
appdelegate是整个应用的入口,通知应用的整个生命周期过程,不应该承担太多的职责。 在葱课项目开发的初期,我们需要用到极光推送,融云聊天,支付宝支付功能等,而这些第三方都需要在UIApplicationDelegate协议的不同代理方法中各自实现注册和响应的相关操作,使得appdelegate变得非常的臃肿。在进行模块化划分之前,葱课项目的appdelegate中的代码达到1千多行。于是我采用了模块划分的方案,将极光推送,融云聊天等细分成各自的模块,在appdelegate中留下钩子,响应的UIApplicationDelegate代理方法被调用时,会分发消息给实现了响应UIApplicationDelegate代理方法的模块,每个模块中只需要完成自己各自的职责即可。
2,网络模块封装
1,请求成功,或者错误的统一处理
我设计了一个AGResponseDefaultDispose.h
类,用于处理请求的结果。该类设置成功,失败,请求结束的处理已经返回的数据的解析方式和数据对应的模型对象。
请求的结果中我们可以做很多的额外操作:如请求时控制器的loading界面,成功或失败的提示等,这些操作都可以在这个类中进行统一的配置,而不用分散到每一个具体的控制器中。
2,取消请求:
a,手动取消请求 我实现了一个分类
NSObject+LGIdentify.h
,使用当前的时间,进去都毫秒,用户生成对象的唯一标识并与对象进行绑定。请求中传入一个请求的上下文对象,上下文对象通过分类获取唯一标识和请求任务进行绑定。取消请求的时候,通过上下文对象的唯一标识就能找到相应的请求任务,取消即可。b,请求上下文对象销毁时自动取消请求: 在一个控制器界面中,我们可能会发起很多个网络请求,在控制器销毁前,网络请求如果没有成功,销毁之后才返回结果,是没有意义的;而这样的网络请求几乎在每个控制器中都存在。因此我设计了一个UIViewController的分类,通过method swizzling替换dealloc方法,在dealloc调用的时候,从网络请求任务列表中取消相应的网络请求。
3,视频模块 使用了抽象工程模式进行设计。 我们的播放器,从AVPlayer,VLC,到最后使用ijkplayer。在使用AVPlayer的时候,播放功能基本完成时才发现部分是视频资源播放时,视频出现严重的卡顿现象,没有找到具体的原因。于是使用VLC测试,当时使用的是电脑的模拟器,模拟器测试,视频都能正常,但是真机上是存在问题的,最后确认使用ijkplayer。这个过程中,播放器的替换和适配,是非常耗费时间的