项目背景:视频社交平台软件,重点是对青少年舞蹈的教学与展示。
项目数据:月打开量在20-25W左右,付费用户在2.5W左右。
项目逻辑架构:APP整体设计采用了模块化结构,页面表现采用MVVM的模式,事件流采用了信号引导的响应式编程,数据管理主要是viewModel中的行为中继与驱动器共同管理,代码管理用的是git,GUI是sourceTree;
技术细节(设计模式的应用):
1.unity模块管理
设计了单例模式的unity访问器,定义了一套unity的行为协议与buffer规范。
场景:unity模块对原生是黑盒,仅仅允许以固定方法输入输出数据,同时以一个工作视图来作为载体运行模块。
基于这种现状:我们定义了一套APP与unity交互的指令体系,负责控制unity的生命周期,控制unity行为,转接用户指令,为unity动作做并发缓冲与有效性确认,实现多线程下的unity嵌入与切换。
2.APP性能监测与优化
场景:对APP的刷新率进行监测,同时从数据更新与界面结构两方面入手优化APP的流畅性。
用官方的runloopAPI监控屏幕刷新率,自设计单例的页面栈管理工具标记卡顿页面,并通过友盟埋点收集。界面性能优化,其一从数据更新来说以弱数据模型代替强数据实现数据与视图的解耦,支持加载没有数据仅有占位的UI元素,在界面上维护列表的数据缓冲,将逐步请求来的数据懒加载到视图,利用节流器控制数据在UI运行时的请求动作,若重复发送,则忽略后续请求,若频繁发送,则推迟后续请求至UI稳定,全局维护图片缓冲。其二从界面结构来说,降低响应树高度,将不响应事件的视图用layer来代替view,当UI出现复杂动画时,在主线程拦截其他控件的事件至动画结束,尽量保证仅在装入数据时将页面更新一次,后续有UI更新遵循谁响应谁更新的原则。
3.购物车与商品SKU
场景:购物车需适应大量商品多sku的展示与交互
实现:以适配器模式设计筛选器,通过swift特性下可携带类型的枚举与泛型协议,实现对不同类型商品与商品的不同类型sku的一次性更新,并实现多账号环境下购物车在本地数据库的归档和解档
4.分享与统一路由(待完善)
5.多线程数据处理与页面更新时机
场景:由于APP的事件流使用了响应式编程,它的优点是面向对象的低理解负担与高ui解耦度。但是它的缺点是信号机制是多线程注册监听也是多线程回调的,需要开发者自行维护它的并发可靠性,同时当数据出现错误时,回溯往往也比较麻烦。
由于界面数据通常来源于多个接口,正常情况下是各自发送请求各自回调。但是UI线程只有一个,一般来说,页面构建时的初步刷新,需要所有数据就位,一般用信号量中的栅栏方法实现。若因为某些原因有的数据无法就位,则先更新已就位数据。同时在UI运行时产生的数据,同样以防抖动的方式向页面更新,若同一数据不得不来源于多个接口,则考虑将其以组合的模式呈现,最后通过数据中继枚举器,以日志的方式判断数据出错的信号来源。