Tangram系列(二) iOS Tangram 通过数据生成动态页面详解

在前面介绍了Tangram框架的历史由来和基本概念后,说明了Tangram解决了什么问题,可以用来做什么,核心是按照业务组件化粒度来实现动态流式页面。在此基础上本文着重分析iOS上Tangram框架如何使用json数据来动态生成流式页面。

Tangram如何用json描述页面

  首先要通过json数据生成视图,我们得明白用怎么样的格式来描述一个页面。
  无论是iOS或是Android UI是跟用户直接交互的重要部分,为了描述一个页面iOS和Android都有各自的一套解决方案和实现思路。平常native开发的更多的是一个2D的界面,为了描述这个界面,iOS和Android都抽象了一个View的概念,一个界面是由多个View组成的,View是页面的最小显示单位,而整个界面是从一个根View节点出发的,也就是一个页面就是一棵View组成的树。
  最后这棵View树如何显示到屏幕上,这涉及到如何在平面坐标系上放置每个View,合成位图传到GPU,GPU上传到帧缓存,最后显示到屏幕上。
  iOS上是View都有一个Frame,平面坐标系的x坐标、y坐标、宽和高,既每个View知道自己在父View的位置和宽高,而屏幕左上角为(0,0)坐标。这样最后通过计算可以知道每个View在屏幕的位置和大小,其中还有一个z坐标的概念,产生重叠知道哪个View在上,哪个在下。iOS上面是根据View的层级,默认从下往上的。随着iOS设备屏幕类型的增多,苹果也引入了AutoLayout,通过添加视图之间的关系约束,最后确定View的位置。


15756188328638.jpg

  Android上面因为屏幕碎片化问题,使用的是layout+View的方式来布局,抽象出一个布局容器的类,通过布局容器类型,综合屏幕宽高、分辨率和View的约束最终确定每个View的位置。这样在不同屏幕上能有一致的显示效果。
  Tangram要保证一套Json格式在多端的同一性,如果采用iOS的布局,Json会非常复杂,而且在Android上没办法适配,因此最后选择借鉴Android上的布局方案,使用布局+组件的形式来描述页面。
  最后页面描述如下图:


15756232811833.jpg

  最后页面由布局和组件组成的树形结构组成,组件其实就是一个业务组成的View,通过type映射成native的业务视图。
  其中组件又由三部分组成,样式、业务数据和交互,布局也有样式。首先根据样式,参照Anroid抽象出style通用格式,包含margin、padding、width、height等,并支持扩展。Element的业务数据完全跟业务相关,由native和业务方约定,事件则抽离出来了EventBus。
  Tangram参照Android的布局,使用Layout+Element+Event灵活一个页面,其中Layout、Element和Event通过type和端上做一一映射。

{
                "type": "container-threeColumn",
                "id": "173",
                "style": {
                    "margin": [
                        "20",
                        "30",
                        "20",
                        "30"
                    ]
                },
                "items": [
                    {
                        "type": "TmallComponent2",
                        "imgUrl": "https://gw.alicdn.com/tps/TB1Nin9JFXXXXbXaXXXXXXXXXXX-224-224.png",
                        "title": "榜单"
                    },
                    {
                        "type": "TmallComponent2",
                        "imgUrl": "https://gw.alicdn.com/tps/TB1Nin9JFXXXXbXaXXXXXXXXXXX-224-224.png",
                        "title": "最新"
                    },
                    {
                        "type": "TmallComponent2",
                        "imgUrl": "https://gw.alicdn.com/tps/TB1Nin9JFXXXXbXaXXXXXXXXXXX-224-224.png",
                        "title": "歌手"
                    }
                ]
            }

Tangram整体框架和各模块功能

  明白Tangram的json格式规范后,接下来就是native如何解析数据和生成视图了,在此之前,我们应该先从整体上把握这个框架的结构。最好的方式是先从模块划分、数据处理时序图、架构类图上面分析,避免一开始就深入某一个细节。

  框架目录如下:


15756253469944.jpg
  • Core:TangramView视图,自定义的类似TableView的视图,最外层容器
  • EventBus:事件处理模块
  • Factory:布局工厂、数据模型工厂、组件工厂,通过注册机制来创建对应类型的布局、模型和组件
  • Helper:数据解析管理器和生成管理器,用来管理工厂和解析
  • Model:通用组件数据模型
  • Protocols:面向抽象接口编程,定义了工厂需要遵循的接口,布局、组件、数据模型需要遵循的协议,全部使用接口来定义,非常灵活

  解析生成框架类图:

15756261943795.jpg

  其中TangramDefaultDataSourceHelper类用来封装TangramDefaultLayoutFactoryTangramDefaultItemModelFactoryTangramDefaultElementFactory三个工厂,提供数据解析成Layout、ItemModel、Element,而这四个类遵循设计模式的开闭原则,都是用注册的方式,方便外接扩展,但是不建议修改。
  TangramLayoutParseHelper类是专门用来解析layout数据的,这个类没有使用注册的方式来解耦合,是因为不同的layout之前有很多相似的逻辑,而且layout数据格式比较统一。
  TangramView类图:
15756262359265.jpg

Tangram如何解析生成Layout和Element

  通过上面的类图和机构图,说明了Tangram解析和生成这块用到的类,其中定义了很多接口,面向接口编程,同时使用工厂设计模式对修改关闭对扩展开放。
  数据处理流程图:


15756296561400.jpg

执行详细流程图:


15756301700794.jpg
  1. 将json数据转为iOS系统的ArrayDictionary,使用TangramDefaultDataSourceHelper对数据进行解析
  2. TangramDefaultDataSourceHelper中调用注册的TangramDefaultLayoutFactory根据不同的类型将数据解析成不同的layout对象,同时调用TangramLayoutParseHelper解析类进一步解析数据,并填充数据到layout对象上
  3. 解析完layout后,调用注册的Item工厂TangramDefaultItemModelFactory解析ItemModel数据,ItemModel是Element的一个暂存数据对象
  4. ItemModel是定义的一个通用组件类,里面包含基础的属性,例如margin、height、width等,同时提供两个map来存储额外的样式数据和业务数据,以此来支持扩展
  5. TangramView调用代理方法,通知要显示相应位置的组件时,再次使用TangramDefaultDataSourceHelper,调用里面注册的TangramDefaultElementFactory工厂,根据ItemModel生成相应的组件视图,并填充相应的数据,同时将扩展的属性通过KVC映射到相应的组件上。

  通过上面的一整套流程和框架,最终将json数据转换成页面显示到屏幕上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274