AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

猿题库客户端的技术细节(排版引擎与版本控制) by 唐巧

发布者 big_data
发布于 1449191008221  浏览 6440 关键词 移动开发 
分享到

第1页

猿题库客户端的技术细节

唐巧



第2页

什么是猿题库



教育



移动 互联⺴⽹网



总⽤用户超过600万



第3页

⼤大纲

• 基于CoreText的排版引擎 • 流量优化 • 特性开关



第4页

基于CoreText的排版引擎



第5页

什么是CoreText



第6页

UIWebView vs CoreText



• 内存 • 精确控制 • 渲染线程 • 交互逻辑



• 复杂度 • 复制粘贴功能



第7页

UBB格式



第8页

⼀一些技术难点

• ⽀支持图⽚片 • ⽀支持链接 • ⽀支持复制粘贴 • ⽀支持互操作



第9页

流量优化



第10页

为什么要做流量优化

• ⾮非wifi情况很多



35%



23%

from http://www.umindex.com/



第11页

为什么要做流量优化



第12页

流量优化的三级⽕火箭

• 缓存题库静态资源 • 缓存题库⾮非静态资源和⽤用户数据 • 实现部分服务器端逻辑



第13页

⼀一、缓存题库静态资源

• 缓存图⽚片 • 缓存公式 • 重要资源内置



第14页

⼆二、缓存题库⾮非静态资源



第15页

⼆二、缓存题库⾮非静态资源

资源更新怎么办?



第16页

⼆二、缓存题库⾮非静态资源

给⾮非静态资源设置⼀一个缓存有效期



第17页

⼆二、缓存题库⾮非静态资源

资源版本号



第18页

资源版本号

• 在每次请求的Http返回的头中,带上资源的版本号 • 当发现资源版本号变化时,有两类做法:

• 版本号加载原则:获得资源改动的列表,丢弃指 定的资源

• 版本号丢弃原则:丢弃缓存



第19页

客户端 version = 1,缓存了4道题⺫⽬目:

101,201,301,401

时 间 线 任意⼀一次⺴⽹网络请求时,

发现版本号变化

请求版本号1与3之间的改动

删除201和301缓存,留下 101, 401 version = 3



服务器

version = 1 version = 2 修改了201和501题的内容 version =3 修改了201和301题的内容

1与3之间的改动为: 201,301,501



第20页

注意事项

• 版本更新需要保证原⼦子性 • 服务器资源更新需要做到多个服务器同时切换 • 客户端更新缓存时,需要等之前的请求结束

• 更新列表太⼤大怎么办? • 没有⺴⽹网络请求获得新版本号怎么办?



第21页

策略列表



资源 题⺫⽬目、解析 推荐列表,真题列表 专项练习 ⾸首⻚页功能列表



版本号原则 加载原则 丢弃原则 丢弃原则 丢弃原则



第22页

缓存⽤用户数据



资源 错题本 收藏本 练习历史 笔记本



版本号原则 丢弃原则 丢弃原则 丢弃原则 丢弃原则



第23页

三、实现部分服务器端逻辑

错题本 version =1 练习历史 version =1

交卷

错题本 version =2 练习历史 version =2



第24页

客户端

练习历史 version=1 错题本version = 1



服务器

练习历史 version=1 错题本version = 1



⽤用户交卷



时 间



⽤用户交卷



更新练习历史 version = 2 更新错题本 version = 2



线 更新练习历史数据



更新错题本数据



发现 verson变化,丢弃 练习历史和错题本缓存



第25页

三、实现部分服务器端逻辑

如何我们能预⻅见到交卷操作会造成版本号变化, 为什么不⾃自⼰己在本地更新数据呢?



第26页

客户端

练习历史 version=1 错题本version = 1



⽤用户交卷



时 间



更新练习历史 version = 2 更新错题本 version = 2



线 更新练习历史数据



更新错题本数据



服务器

练习历史 version=1 错题本version = 1

⽤用户交卷

更新练习历史 version = 2 更新错题本 version = 2

更新练习历史数据 更新错题本数据



发现 version与服务器⼀一致



第27页

三、实现部分服务器端逻辑



功能模块 错题/收藏/笔记列表

练习历史 个⼈人设置



本地维护版本号和数据



第28页

⼀一些问题

• 同⼀一帐号在多终端同时使⽤用怎么办? • 版本号丢弃原则



第29页

特性开关



第30页

特性开关

⼀一套基于版本号的远程控制逻辑



第31页

特性开关的⽤用处:AB测试



第32页

特性开关的⽤用处:灰度发布



第33页

特性开关的⽤用处

远程开启/关闭功能模块



第34页

特性开关的⽤用处

配置应⽤用的各种参数



第35页

特性开关的⽤用处

传递⼀一些远程执⾏行的脚本



第36页

实现-服务器端

• ⽤用什么当版本号?— 时间。 • 版本号切换的原⼦子性。



第37页

实现-客户端

• 实现了⼀一套基于版本号缓存的iOS⺴⽹网络库 • 基于AFNetworking



第38页

当客户端要发送请求时



Agent



• 根据当前请求的URL,参数,计算出缓 存⽂文件名 cacheName

• 尝试获得该缓存⽂文件的内容,以及缓存 的时间

• 如果缓存⽂文件存在,并且没过期,则返 回缓存⽂文件内容,否则才发送⺴⽹网络请求

• 将⺴⽹网络请求返回值缓存



第39页

实现-客户端

https://github.com/yuantiku/YTKNetwork



第40页

YTKNetwork功能列表⼀一

• ⽀支持按时间缓存⺴⽹网络请求内容 • ⽀支持按版本号缓存⺴⽹网络请求内容 • ⽀支持统⼀一设置服务器和CDN的地址 • ⽀支持检查返回JSON内容的合法性 • ⽀支持⽂文件的断点续传



第41页

YTKNetwork功能列表⼆二

• ⽀支持block和delegate两种模式的回调⽅方式

• ⽀支持批量的⺴⽹网络请求发送,并统⼀一设置它们的回调

• ⽀支持⽅方便地设置有相互依赖的⺴⽹网络请求的发送

• ⽀支持⺴⽹网络请求URL的filter,可以统⼀一为⺴⽹网络请求加上⼀一些 参数,或者修改⼀一些路径。

• 定义了⼀一套插件接⼝口,可以很⽅方便地为YTKRequest增加 功能。



第42页

谢谢

微博:@唐巧_boy 

我的“iOS开发”微信公众号:



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。