阅读更多

1顶
0踩

移动开发

转载新闻 Facebook iOS新版应用:两倍速度的背后

2012-08-30 17:34 by 副主编 MnouW 评论(0) 有3696人浏览
Facebook上周发布了新版iOS应用,号称速度提升两倍。Facebook工程师Jonathan Dan在Facebook官方页面中撰文,介绍了新版iOS应用、Facebook iOS应用的发展历程以及开发思路。


以下为文章全文:

我们今天发布了新版iOS应用,速度更快、更可靠、更易用。这款新应用标志着Facebook移动产品开发方式的转型,即深耕不同平台。为了便于你们理解这一转型,让我们回顾移动版Facebook的发展历程。

起步阶段的Three20框架:技术过时,首次弃用

早期的iPhone版Facebook诞生于iPhone的起步阶段,当时还没有iPad,而系统也不叫iOS。在早期版本中,我们开发了名为Three20的开源框架,其中包括当时系统尚未提供的组件库。

在随后几年中,Three20成为iOS社区最流行的开源项目之一,帮我们解决了很多问题。然而随着技术的发展,Three20逐渐显得过时。其功能越来越复杂,对入门者来说上手变难。另一方面,随着iOS核心的迅速发展,Three20的一些功能也显得没有太大用途。因此,最新版iOS应用是我们这么多年来首次没有使用Three20框架。

HTML5的发展:跨平台快速迭代

随着过去几年移动设备的发展,我们最需要解决的问题是,无论你用什么设备、平台、运营商网络,甚至无论你在哪里,都应当获得不错的移动体验。为了支持数千款手机和多个移动平台,我们利用HTML5技术去开发移动版Facebook,并向包括iOS在内的多个平台发布。

利用HTML5,我们只要进行一次开发,就可以向多个平台发布产品。这样做使我们能覆盖尽可能多的用户,也使Facebook移动业务发展到了当前的规模。实际上,我们选择HTML5不仅是因为可以跨平台使用一套代码,也是由于这样做有利于快速迭代,在不发布新版本的情况下测试新功能。

基于这一网页技术,我们为5亿Facebook移动用户提供服务,并支持了7000多款设备。然而我们意识到,对iOS这样的平台来说,人们会希望更快、更可靠的体验,而这正是我们iOS应用的不足之处。我们已经普及了移动服务,现在需要深耕服务。因此,我们从头开始重写了Facebook的iOS应用,专注于质量,并充分利用iOS系统自身这些年来的发展。

一切为了速度:耗时任务扔后台

开发原生iOS应用带来了一个显而易见的好处,就是应用的速度。在新版iOS应用中,动态汇总的滚动明显更流畅,而具体实现方式则是对处理任务的系统资源进行更好的调度。例如在iOS中,主线程驱动用户界面,处理触控事件,因此如果在主线程中处理太多任务,那么应用就会变慢。为了解决这一问题,我们尽量在后台处理对计算资源要求较高的任务,包括所有网络活动、JSON分析、NSManagedObject对象创建以及存盘等。

可以再举另一个例子。我们使用Core Text显示字符串,但排版计算很快成为一个瓶颈。在新版iOS应用中,当我们下载新内容时,我们以异步方式计算字符串大小,缓存在CTFramesetters中,当需要在UITableView中显示时再利用这些计算结果。

在iOS中启动Facebook应用时,你会想看见动态汇总,而不是正在加载的下拉列表。因此,为了提供最好的体验,我们在应用启动时立即显示此前缓存的内容。不过这带来了新问题:如果你的动态汇总中内容太多,那么UITableView将调用一个委托函数tableView:heightForRowAtIndexPath:,对每条内容进行处理,以计算滚动条长度。这将导致应用需要从磁盘中加载所有内容,对整个内容排版进行计算,随后返回所有内容的高度总和。这意味着,当动态汇总中内容过多时,启动速度会变得更慢。

解决这一问题的方法分为两部分。首先,当我们初始化异步排版计算时,我们在Core Data中存储了内容的高度。通过这样做,我们避免了在tableView:heightForRowAtIndexPath:函数中计算排版信息。其次,我们将“内容”的模式对象进行分解,在应用启动时只会从磁盘读取内容的高度信息,随后才读取其他信息。而其他的排版计算均通过异步方式来完成。

通过以上这些方式,我们在屏幕滚动时实现了更高的帧率,并使应用保持响应。

新的基础:Messenger及其他

开发人员总是避不开一些限制,一些是技术上的,一些是设计上的,一些则是由产品需求引起的。当我们重新开发iOS应用时,一款新的原生应用Facebook Messenger正越来越流行。为此,我们需要完全集成Messenger的底层架构和用户界面,并充分利用Messenger团队此前已经过充分测试的代码。当点击iOS应用中“Messages”图标时,运行的代码将与Facebook Messenger应用完全一致。

为了实现这一目标,我们按模块来搭建系统。当你在左侧导航菜单中点击书签时,模块提供的视觉效果将得以显示。动态汇总、Messages、Friends,这些都是模块。模块也会说明相互之间的依赖关系。例如,我们使用MQTT去更新通知、消息和书签。在应用启动时,应用会遍历依赖关系图,确保在通知功能启动前先启动MQTT服务。在增加新功能时,模块系统也将确保应用在正确时间、正确位置启动。

尽管模块系统部分解决了问题,但Messenger也不可能简单地以新核心取代当前代码。新版iOS应用中的认证系统以及Messenger应用的执行方式共享了同一界面的对象。用Objective-C的语言来说,就是“遵循了同样的协议”。通过与Messenger团队的合作,我们开发了依赖注入系统,向Messenger代码提供了用于实时验证的对象。当作为一款独立应用时,Messenger代码以自己的方式处理这些对象。当作为Facebook应用的一个模块时,将采取不同的处理方式。在代码中加入这些对象是一个聪明的做法。

未来计划

目前,动态汇总中的内容都有页面头,其中包括内容预览图、时间戳、消息、照片、视频,以及“赞”和“评论”按钮。这通过HTML5很容易实现,并且可以快速更新设计,例如用户何时更新了动态汇总,使照片尺寸更大等。不过,动态汇总也在持续发展,当我们增加新功能时,采用Objective-C的方法将带来新的挑战。

为了解决这一问题,我们采用不同的方式去增加新功能,同时不必升级整个应用,这就是“回退机制”(fallback)。当动态汇总团队设计了一种新的内容形式时,iOS应用将下载到一些无法识别的内容。当我们检测到这种内容时,我们将使用回退渲染器,以应用可识别的格式显示新内容中的相关信息。与此同时,我们开发了新的定制渲染器,在下一次应用升级时发布。对于应用中可能经常更新的部分,我们仍将继续使用HTML5代码,这样我们可以在服务器端推送升级,而用户不必下载新版本应用。

Via Facebook官方博客
来自: 新浪科技
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 在Sql Server 数据库中利用存储过程实现动态交叉表

    详细介绍了SQL server数据库在存储过程中实现动态交叉表的实现方式和作用。

  • 30秒创建一张复杂交叉表

    以前设计一张复杂交叉表,使用代码或者其他控件实现需要几天几小时实现。现在使用报表控件ActiveReports/ActivereportsJS 只需要30秒就能快速设计一张复杂交叉表。提供可视化的报表设计器,快速上手。 数据库直连,拖拉拽设计报表 ...

  • 【PB】提取动态交叉报表动态标题名和动态列值

    //提取动态交叉报表动态标题名和动态列值: String ls_Str, ls_Str1, ls_Name, ls_Name_Text, ls_Text Long ll_Cnt, ll_CntTmp, i, ll_Row dwobject ldwo environment env GetEnvironment(env) ll_Cnt = Long(dw_2.Describe

  • 交叉表部分行的折叠与展开_Cognos

    交叉表部行的折叠与展开(不知专业术语叫什么,暂时先这么叫吧): 点击行标题左边的“+”号,可展开该行的二级节点,再点击则隐藏。 附件是制作过程的录像,和js源代码 因录像是exe格式文件,360可能会报有木马,不过请大家放心使用。

  • 77、jquery表格交叉高亮显示

    77、jquery表格交叉高亮显示

  • 交叉表的创建及交叉表数据排序设置

    本文详细讲述一下如何创建交叉表以及交叉表的一些简单定制 水晶报表9.2,同样适用于水晶报表10(含)及以下版本 准备 首先你要知道什么是交叉表,又是在什么情况下需要用交叉表 “交叉表”对象是一个网格,用来根据指定的条件返回值。 数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成: 行 列 摘要字段 我做了简单的表格进行说明,相信你可以很快跟你的应用对上号了 好,现在我们...

  • 动态交叉表头报表的制作

    在数据信息系统中,常常会看到这样一类报表需求,它们的样式为交叉报表的变形(既纵向分组扩展又横向分组扩展,在交叉区域对统计项进行汇总),同时在纵向分组时,要求每个组跟随一个与分组相对应的横向表头。对比效果如下图所示:从上图可看到,报表纵向按照年进行分组扩展,同时每年又能生成一个横向分组表头,该表头按照地区横向扩展,并且根据年份的不同而不同。如上图所示:2014年有6个地区,而2015年由于数据不同只...

  • javascript实现多表头分类交叉报表:html表格

    DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> HTML> HEAD> HEAD> BODY> div id="report"> div> br> input type="button" value="create" onclick="create()"> script>... funct

  • 存储过程实现交叉表

    物料编码 供应商ID 日期 单价 001 A011    2008.3.1 1.3 001 A011   2008.7.9 1.5 001 A011   2008.12.1 1.1 以上是不同日期同一个物料在同一供应商的单价 我要求变成这样一种交叉报表 物料编码 供应商ID 2008.1 2008.2 2008.3 2008.4 2008.5 2008.6 2008.7 2008.8 2008.9

  • 经常用到的交叉表问题,一般用动态SQL能生成动态列

    原始表如下格式: Class     CallDate    CallCount 1     2005-8-8    40 1     2005-8-7    6 2     2005-8-8    77 3     2005-8-9    33 3     2005-8-8    9 3     2005-8-7    21 根据Class的值,按日期分别统计出CallCount

  • 通用交叉表存储过程

    alter proc p_qry@TableName sysname,--表名@纵轴 sysname,--交叉表最左面的列@横轴 sysname,--交叉表最上面的列@表体内容 sysname,--交叉表的数数据字段@条件 varchar(1000),--查询的处理条件@是否加横向合计 bit,--为1时在交叉表横向最右边加横向合计@是否家纵向合计 bit--为1时在交叉表纵向最下边加纵向合计as...

  • 用于生成交叉表的存储过程的存储过程 :_)使用起来超简单

    以前总是在网上搜一些交叉表生成的相关代码 但是使用起来总是很复杂 看看 刚出炉的东西对你来说是不是有所帮助 :_)先看看下一个生成的存储过程 :SQLServer2000Create Procedure [dbo].[pGet_Cross_Simple_Report_For_统计生成表_By_工龄编码_职称编号]As--pGet_Cross_By_统计生成表Begin--CREATE T...

  • sql语句交叉报表实现

    select isnull(aa.ProductSortCode,)+`+ isnull(aa.ProductCode,) KeyEx     ,aa.*,bb.TheName ProductName,bb.ConfigName,ProductSortName,cc.TheName ClientName into #crosstabfrom(select a.ProductCode,a

  • mysql 交叉表 存储过程_SQL存储过程实现SPSS交叉表(有图有真相)

    SP代码:/****** Object: StoredProcedure [dbo].[Pro_CrossTable] Script Date: 03/27/2014 20:46:38 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER proc [dbo].[Pro_CrossTable] (@tableName nvarc...

  • mysql 交叉表 存储过程_通用交叉表存储过程

    alter proc p_qry@TableName sysname,--表名@纵轴 sysname,--交叉表最左面的列@横轴 sysname,--交叉表最上面的列@表体内容 sysname,--交叉表的数数据字段@条件 varchar(1000),--查询的处理条件@是否加横向合计 bit,--为1时在交叉表横向最右边加横向合计@是否家纵向合计 bit--为1时在交叉表纵向最下边加纵向合计as...

  • 什么是交叉表

    今天有人问我什么是交叉表,汗!一时还不好解释,就上网搜了一下,找到了一些资料: “交叉表”对象是一个网格,用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成: 行列摘要字段 “交叉表”中的行沿水平方向延伸(从一侧到另一侧)。在上面的示例中,“手套”(Gloves) 是一行。“交叉表”中的列沿垂直方向延伸(上

Global site tag (gtag.js) - Google Analytics