本文主要内容
一.图片缓存
二.阅览时长计算
三.杂乱页面架构
四.客户端全体架构
引进问题:架构和结构运用到日常开发进程,要解决的问题是什么?
- 模块化
- 分层
- 解耦
- 降低代码重合度
一.图片缓存
1.1、怎样规划一个图片缓存结构
- 办理者Manager:图片缓存结构首要需求一个办理者用以协谐和调度结构内部的各个模块;
- 内存:负责内存办理的模块,关于图片的缓存;
- 磁盘:图片磁盘缓存;
- 网络:经过网络下载图片;
- Code Manager
- 图片解码
- 图片压缩/解压缩
1.2、图片读写
问题一:图片经过什么办法进行读写,进程是怎样的?
- 以图片URL的单向Hash值作为Key(
多级缓存提高查找功率
)
1.3、内存规划
问题二:内存的规划上需求考虑哪些问题?
存储的Size
-
筛选战略
-
以行列先进先出的办法筛选
-
LRU算法
,即最近最久未运用算法(如30分钟之内是否运用过)
-
1.4、磁盘规划
问题三:磁盘规划需求考虑哪些问题?
- 存储办法
- 大小约束(如100MB)
- 筛选战略(如某一图片存储时间距今已超越7天)
1.5、网络规划
问题四:网络规划需求考虑哪些问题?
- 图片恳求最大并发量
- 恳求超时战略
- 恳求优先级
1.6、图片解码
问题五:对于不同格局的图片,解码采用什么办法来做?
- 应用战略形式对不同图片格局进行解码。
问题六:在哪个阶段做图片解码处理?
- 磁盘读取后
- 网络恳求回来后
1.7、线程处理
外界经过图片URL对应的Key对图片进行获取时,首要经由Manager到内存中查找。
- 假如在内存缓存中射中,直接把内存成果回来给调用方;
- 假如在内存缓存中没有对应图片的数据存在,需求经过Manager读取磁盘缓存数据,假如在磁盘缓存中找到图片数据,就把数据回来给调用方,一起将磁盘中读取的图片数据对应的放到内存缓存傍边,方便下次更快运用;
- 假如在磁盘缓存中没有读取到对应图片数据,需求建议网络恳求,将网络成果回来给调用方,一起放到内存缓存中!
二.阅览时长计算
2.1、怎样规划一个时长计算结构?
2.2、为何要有不同类型的记载器,考虑是什么?
- 依据不同分类场景供给的关于记载的封装、适配;
2.3、记载的缓存和存储
问题一:记载的数据会由于某种原因丢掉,怎样处理?
降低丢掉率
- 守时写磁盘
- 限定内存缓存条数(如10条),超越该条数,即写磁盘
2.4、上传记载器
问题二:关于延时上传的详细场景有哪些?
对应立即上传
,假如每一条记载都立即上传会耗费客户端的性能和流量。
- 前后台切换
- 从无网络到有网络的改变
- 通用轻量接口捎带(罕见)
问题三:长传机遇是怎样把控的?
- 立即上传
- 延时上传
- 守时上传
三.杂乱页面架构
- 微博APP的正文页
- 去哪儿游览APP的航班列表
- 今日头条、腾讯新闻等资讯类APP的多签主页
- 脉脉APP的多签主页
3.1、全体架构
视图层:View & ViewController
事务逻辑层:ViewModel
数据层:Engine & Model
3.2、数据流
3.2.1 数据流流向
3.2.2 数据及数据联系
-
网络数据
:包括【一级谈论】、【二级谈论】、【转评赞】、【广告、推荐等其他数据】等; - 事务数据:包括【id data】、【int type】等;
- UI数据:【imageObj】、【labelObj】(frame/value);
3.2.3 反向更新
3.3 杂乱页面架构总结
- MVVM结构思维
- ReactNative的数据流思维
- 体系UIView更新机制的思维
- FaceBook的开源结构AsyncDisplayKit关于预排版的规划思维
3.3.1 MVVM
即Model + View + ViewModel
- Model:数据层
- View:视图层和ViewController
- ViewModel:事务逻辑层
1、UIViewController对ViewModel进行强引证或ViewModel作为其成员变量,ViewModel经过Block的办法将输出成果回传给运用方,或许经过RAC函数呼应式编程把对应的输出回传给视图;(View层<==>事务员逻辑层)
2、ViewModel对数据层Model有强引证或Model作为其成员变量,数据层Model经过Block办法或署理办法回传数据给事务逻辑层;(数据层<==>事务员逻辑层)
3、View层包括View视图层和ViewController层。
3.4、RN数据流思维
总结:任何一个子节点或后代节点没有权力做自己的改变更新,有必要要把自己的改变更新消息反向传递给根节点,由根节点自顶向下问询哪些需求更新
!
四.客户端全体架构
-
独立于APP的通用层
(能够放在任何APP作为底层结构):比方包括时长计算结构、溃散的计算、网络的第三方库等; -
通用事务层
:通用根底组件,比方包括自定义步进控件、特殊UIImageView的封装等; -
中间层
:协调停耦效果; 事务层
问题一:事务之间的解耦通讯办法
-
OpenURL
-
依靠注入
1.把事务C注入到中间层,事务A去中间层获取; 2.事务C完成中间层的署理/协议办法并回来一个详细目标给中间层,在事务A运用的时候,经过对应协议从中间层中依据某一办法获取遵照某一协议的一个实例。在事务A中能够把这个实例作为遵照某一协议的透明目标,这样就到达解耦目的。
本文总结
图片缓存
阅览时长计算
杂乱页面架构
客户端全体架构
有任何问题,欢迎各位谈论指出!觉得博主写的还不错的麻烦点个赞喽