在iOS应用中处理大文件

我们如何使Kaleidoscope for iPad尽可能灵敏。

近十年来,万花筒一直是一种流行的生产力工具,这有充分的理由:桌面应用程序具有无与伦比的性能,因此可以无缝地进行文件比较和合并。

当我们着手将万花筒带入iPad时,我们知道过渡将相对简单。 但是,由于预计通过平板电脑的基于触摸的UI可以快速轻松地进行交互,因此我们预计在开发过程中会遇到一些障碍。 最大的三个挑战是:

  • 比较两个文本文件后,快速显示较大的文本差异。
  • 快速响应由多任务处理(即,打开第二个应用程序)和设备旋转引起的UI大小更改。
  • 确保在较大的文本差异中滚动是平滑且无死角的。

所有这些挑战都是相关的; 共同的主题是确保在处理大型文本差异时,该应用程序具有尽可能高的响应速度。

清除障碍

创建大型,复杂的文本比较既费时又会影响性能。 为了提高效率,我们确保仅在需要时才产生文本差异。 为了清除出现不必要的文本差异的实例,我在Xcode中创建了一个断点,该断点可以播放声音并在产生差异时继续执行。 如果我听说过应该不生成差异时遇到断点的情况,我将调查原因。

使用并发队列

在构建高响应性应用程序时,重要的是您必须并行执行尽可能多的工作。 由于文本差异涉及比较两个文本文件,因此在UI中布置差异的逻辑还涉及两次执行某些操作(每个文件一次)。 我们使用OperationQueue类的实例创建并发工作项队列,同时执行了这些“对”工作项。

例如,由于各种UI布局原因,必须计算文件中每行文本的渲染高度(可能是换行高度)。 这些行高测量可能需要一段时间才能完成,尤其是对于大型文本文件。 因此,我同时测量了每个文件作为单独的Operation对象的行高。 这两个操作被添加为使用它们收集的线高信息的操作的依赖项,因此,一旦该信息可用,将自动开始需要线高的工作。

缓存布局信息

如上所述,计算文本差异的布局可能很耗时。 信息一旦存在,就将其保存在内存中,并以文本差异UI的宽度为键。 缓存的信息有助于确保旋转设备或通过同时打开另一个应用程序来调整窗口大小,从而尽可能地做出响应。 如果用户碰巧调整iPad的系统范围的字体大小首选项“动态类型”,则清除缓存的布局信息,因为字体大小的更改要求重新计算所有布局信息。

优化性能

在Instruments中使用Time Profiler可以帮助确定性能瓶颈。 有时,在较小的文本差异上效果很好的数据结构或算法最终会成为较大数据集的严重性能问题。 仪器(特别是Time Profiler仪器)派上了用场,以查看我的哪些方法正在占用CPU。 一旦确定了问题区域,便可以设计出一种更有效的方法。 仪器的使用极大地帮助了这种“使之工作,然后根据需要进行优化”的方法。

使用阵列节省时间

避免执行许多Swift字符串连接,而是加入字符串数组。 使用+ =从很多片段中构建一个大字符串比将那些较小的字符串添加到数组然后调用join方法要慢得多。 对于大量文本,此优化将方法花费的时间从10秒减少到大约10毫秒。

新设备,不折不扣的性能

在iPad上,性能可以说比在台式机上更为重要,因为用户可以触摸UI并期望立即得到响应。 加上iPad具有比台式或笔记本电脑更低的马力这一事实,因此保持警惕以确保性能保持尽可能合理变得更加重要。

随着我们为iPad改进万花筒,我们将继续将性能和响应能力放在首位,并在此过程中与您分享我们的见解。 立即下载iPad版万花筒,免费试用14天。