iOS面试之架构模块
2019-12-16 本文已影响0人
木子心语
架构
架构内容如下:
- 图片缓存
- 阅读时长统计
- 复杂页面架构
- 客户端整体架构
- 等等
1.架构设计的目的
- 模块化
- 分层
- 解耦
- 降低代码重合度
2.图片缓存
-
怎样设计一个图片缓存框架?
图片缓存框架.png
- 图片缓存框架,需要一个管理者
- 需要一个内存管理模块
- 需要对图片磁盘上的处理
- 本地没有图片,可以通过网络下载图片
- 如果图片如果压缩或者是解码,需要解码的管理者
- 需要负责图片解码,图片压缩/解压缩
- 图片读写的方式,过程是怎样的?
- 以图片URL的单向Hash值作为Key
图片缓存.png
- 图片缓存,先到内存中进行查找,如果找到,结束查找
- 如果缓存中,没有找到,我们可以通过磁盘查找,如果磁盘查找找到,结束查找
- 如果没有找到,通过网络下载,图片缓存结束
- 内存的设计上需要考虑哪些问题?
- 存储的大小
- 淘汰策略
-
淘汰策略
-
先进先出淘汰
-
LRU算法(最近最久未使用的页面予以淘汰),某个时间内是否使用过
-
定时检查,开启定时器,多少时间内未使用予以淘汰,影响性能
-
提高检查触发频率:每次进行读写时;前后台切换时
-
注意时间空间的开销
-
-
磁盘设计需要考虑哪些问题?
- 存储方式
- 大小限制
- 淘汰策略 ,某一图片存储时间距今已超过7天
-
网络部分的设计需要考虑哪些问题?
- 图片请求最大并发量
- 请求超时策略
- 请求优先级
-
对于不同格式的图片,解码采用什么方式来做?
- 应用策略模式对不同图片格式进行解码
- 在哪个阶段做图片解码处理?
- 磁盘读取后:从磁盘读取未解码,放在内存中解码完成,系统显示图片之
前,会在主线程进行图片解码操作,从磁盘读取后进行解码,放在内存中
- 网络请求返回后:通过对图片解码,回传给内存模块,通过管理者在内存模块中进行缓存
2.阅读时长统计
-
怎样设计一个时长统计框架?
时长统计.png
- 分为2块:记录器,记录管理者
- 记录器:负责对每一条时长统计的数据进行记录
- 记录管理者:记录器时长数据交给记录管理者进行统计
- 记录器
- 页面式,比如视频,阅读时长同push开始,到pop结束为结点
- 流式,比如新闻的阅读时长记录
- 自定义记录器
- 记录管理者
- 记录缓存(通过内存记录,如果出现,应用退出及手机停电的问题,怎么处理?)数据会丢失
- 通过磁盘存储,记录时长统计数据
- 需要一个上传器记录时长统计记录交给服务器端,保证记录时长的正确性
- 为何要有不同类型的记录器?
- 不同分类场景提供的关于记录的封装,适配
- 记录数据由于某种原因丢失,怎样处理?
- 定时写磁盘
- 限定内存缓存条数,超过某条,就写磁盘
- 关于延时上传的场景有哪些?
- 前后台切换
- 从无网到有网的变化
- 上传时机是怎样把控的?
- 立刻上传
- 延时上传
- 定时上传
3.复杂页面架构
- MVVM
- Model :数据层
- View :包含ViewController, ViewController对ViewModel强引用,作为
ViewController的成员变量,viewModel通过block的方式,回传结果给使用方
- ViewModel 业务逻辑层, ViewModel对model强引用,model通过block或者代理模式回传给业务层
4.客户端整体架构
客户端整体架构.png- 客户端独立于App的通用层
- 通用层,时长统计框架,崩溃统计,网络第三方库
- 放到任何App,都可以起到支撑的作用
- 通用业务层
- 公司通用的基础组件
- 中间层
协调与解耦的作用
- 各个业务层
问题:业务层之间如何解耦?
- OpenURL
- 依赖注入的方式
QQ交流群: 796142709