重新架构Pinterest的iOS应用

加勒特·月亮| Pinterest工程师,iOS核心体验

一小组Pinterest iOS工程师最近获得了每个工程师梦dream以求的机会-完全重新思考和重建我们的应用程序。 我们发展如此之快,以至于对我们的平台提出了很高的要求。 为了覆盖全球下一个亿的Pinner,我们从头开始重新构建了平台的架构,该框架的内置速度更快,扩展更容易,并且在许多不同的情况下,Pinners的速度提高了3倍。 以下是该项目的一些较大部分,还有更多内容将在未来几周内发布。 出发吧!

表现胜出

要在美国以外的国家/地区吸引更多人,则要求该应用程序性能尽可能出色,尤其是在旧设备上。 这意味着需要解决以前可能出现的问题(例如,滚动家庭供稿时帧丢失)。 减少能耗和提高性能的最快,最简单的方法是利用大多数iPhone具有多个处理器这一事实。

我们的新系统严重依赖多线程代码。 UI渲染,图像下载,GIF解码和模型处理都是我们设计为多线程的系统的所有示例。 这使我们可以更好地保持Pinner轻触时滚动和响应的流畅性。 在测试中,我们测得触摸响应和滚动平滑度提高了10倍。 没有一堆细微的调整,什么绩效项目才能完成? 我们至少构建了三种不同的方法来圆角化视图(在CALayer上使用cornerRadius属性的成本之快令人惊讶地加起来了)。

异步显示

大多数新框架都建立在AsyncDisplayKit(ASDK)之上,AsyncDisplayKit是一个开放源代码iOS框架,最初由Pinterest工程师Scott Goodson编写,可保持UI流畅和响应。 ASDK似乎是解决我们问题的灵丹妙药,因为它提供了UI的异步呈现,因此我们可以完成布局和呈现主线程的昂贵工作。

尽管异步显示是ASDK的主要承诺,但它还提供了一个类似于CSS Box Model的布局系统,可以轻松使用CALayers而不是UIViews(不需要注册触摸时),并且还可以进行其他许多性能改进。 一种特别具有影响力的优化是滚动视图的不同范围的计算。 ASDK将在Pinner的滚动位置之前计算一个单元格范围,该单元格需要从网络中获取其数据,并需要较小范围的单元格以进行预渲染。 这将自动允许及时获取,渲染和清除用户已通过的范围,从而节省了内存和在各个运行循环上花费的时间,从而加快了滚动速度。

当然,在重写几乎整个应用程序以利用ASDK的过程中,我们发现了错误,并向项目提交了许多改进。 实际上,对ASDK的十大贡献者中有五位是Pinterest员工。

不变的数据模型

历史上,另一个重大的痛点是由我们的模型系统引起的。 我们拥有的系统是间歇性线程安全的,并且虽然可以在后台线程上创建模型,但需要对模型进行任何修改才能在主线程上进行。 这对性能不利,并且引入了开发人员并不总是显而易见的复杂性,从而导致许多崩溃。

我们需要的是一个线程安全和高性能的系统。 保证线程安全的最简单方法是使所有内容保持不变,但是要更改近100种模型并在开发新功能时对其进行更新是一个挑战。 为了解决这个问题,我们自己生成了它们。 我们的一位杰出工程师(Rahul Malik)离开了,学到了一些Swift并建立了一个将JSON文件变成不可变模型的系统。 我们对生成器感到非常兴奋,并将很快将其开源并通过博客发布!

现在,我确定您正在问自己:“但是Garrett,如果您的模型是不可变的,如何在您的主板上获得架构图钉?” 我很高兴你问! 我们新的不可变模型允许使用构建器系统创建修改后的副本。 我们有一个强大的框架(由才华横溢的Wendy Lu构建),可以快速安全地将更改通知UI和其他感兴趣的观察者。 我们很快将分享有关模型,生成器和系统的更多信息,以使UI保持同步。

新的设计语言和系统

除了几乎完全重写iOS应用程序之外,我们还承担了全面改革视觉设计的任务。 我们与产品设计团队紧密合作(包括到波特兰远程办公室的实地考察),以实现一种新的设计语言和框架,从而简化了针对多种设备尺寸的构建应用程序的工作。 与设计师一起,我们创建了BRIO的外观(内部设计代号)和要点(即“主体”)以指定设备不可知的布局。 一旦大声说出来,它就不会消失。

新框架还根据屏幕大小和语言自动缩放字体,边距和字距。 我们发现中文,日文和韩文语言对于本机读者来说显得太大了,没有一点扩展,因此我们的框架会自动处理。

总体而言,这是任何工程师都可以落后的系统:适用于任何屏幕尺寸的一种实现方式(好吧,如果IPAD分散存在,还可以##,但至少要少一个数量级)。

没有一些新的交互设计,什么视觉刷新才能完成? (这正是我们在就寝时间之前完成项目时问自己的问题。)因此,我们面临着以高性能方式构建新动画和过渡的挑战。 您如何制作一个按钮,无论它在用户界面中的何处显示,都可以扩展到其范围之外? 您如何计算变换以模拟图像成长为全屏和不同的宽高比? 我们将在后续帖子中回答棘手的问题。

日志,日志,日志

最重要的是,通过所有更新,我们希望确保Pinners将继续享受发现和保存想法的经验。 唯一的方法就是准确测量使用情况! 但是如果我们必须为应用程序中的每个按钮编写代码以将日志发送到服务器,那将是可怕的。 为什么不构建一个可以询问按钮的智能系统,“关于您的任何特殊信息,按钮? 您在什么位置?”。 这就是为什么我们的一位才华横溢的工程师(Chris Danford)构建了一个系统,该系统可以解决大部分日志记录难题,而无需开发人员做很多事情。 它遍历层次结构,收集上下文并生成详细的日志记录并将其发送到后端。

我们一直在运送此项目的漫长旅程中,我们都为我们所取得的成就感到无比自豪-一个闪亮的新应用程序在低端设备上表现出色,同时提供了出色的体验。 我们迫不及待想与您详细分享我们的工作方式。

Android和Web在我们的清单上排名第二。 如果您很高兴能帮助我们从头开始构建这些框架,请加入我们的团队!

致谢:此更新是公司全体成员的一项艰巨任务,其中包括艾伦·威廉姆斯,阿拉·罗森茨威格,安德烈亚斯·皮尔斯特罗姆,奥斯汀·劳顿,比尔·昆兹,布伦丹·瑞恩,刘斌,克里斯·丹福德,康纳·蒙哥马利,埃文·夏普,惠·阮,加勒特·穆恩, Gordon Chen,Jay Marsh,Jenny Liu,Kim Fellman,Leo Liu,Levi McCallum,Long Cheng,Lukas Blakk,Luke Zhao,Martin Jiang,Max Gu,Michael Schneider,Nicole Hedley,Patrik Goethe,Rahul Malik,Ricky Cancro,Rocir Santiago ,Romi Phadte,Samuel Hsiung,Scott Goodson,Steven Ramkumar,Tom Watson,Vincent Tian,Vivian Qu,Wendy Lu,Wuyun Wu,Adam Barton和我们数据和业务分析团队的无数人