如果你是一个iOS App开发者,在开发App过程中,App具有优越的性能将显得尤为重要。当App被下载,用户对你的App抱有期待,如果App响应不及时或者运行缓慢,将会令用户非常失望。
现如今,App早过了以量取胜的时代,虽然应用市场里充斥着五花八门的App,但能让用户爱不释手的依然屈指可数。而这些App都具有界面友好、效率高、粘连度强、体验流畅的特点,不仅能够增加用户量,减少卸载率,还能够提高业务质量。
然而,做到这些却不是某些开发者的特长,笔者觉得如果可以做到以下几点,那应用就离优秀越来越近了。
1、代码自文档化
对于支持文档的系统,通常会面临以下挑战:
我们不需要额外的工作
编写和阅读文档非常耗时,开发者们更愿意将时间花在编写程序上。
所有的独立文档都必须随着代码的更新而持续更新
在大型项目中,这将是一项艰巨的任务,因为不更新任何文档将会导致危险的错误和产生错误的信息。
大量的文档不便于管理
在大量文档中查找正确的文档极其不易,文档也必须接受版本的控制,必须确保所阅读的文档的版本与所处理的代码的版本相对应。
解决方案:分布在不同文档中的重要信息很容易被错过
作为一款优秀的应用,具有能够快速扩展以及高可维护性的特性是必不可少的。那么我们怎么做才能既不需要写很多注释,又能保证代码易于理解呢?其中一个主要的方法就是代码自文档化,通过可读性强的代码来提升App优化的速度,将是App优化最关键的一步。
2、贴切的动画效果实现
随着动画效果的作用越来越大,仔细考虑 UI 如何移动——从提升可用性的过渡到让用户喜欢上应用的每一个微小细节。就变得比以前任何时候都重要。
常见基础动画效果:翻转、平移、放大、缩小。复杂一些的就是将以上基础动画进行组合。随着扁平化设计的愈加流行。常见的应用场景有:界面之间的平滑切换,对话框渐进淡入、淡出,以及上拉下拉刷新等待条等动画效果被越来越多的应用使用,让应用本身变得越来越平常。如果能从产品特点入手,设计贴切的交互体验、合理的动画效果,将使得产品加分不少。
以下是糖果的果冻Q弹动画实现:
获取所有的帧数,这里使用的是弹簧的公式f=k*x。对于未知参数,使用常量替代。
播放关键帧动画,将帧参数传入。
复杂的动画效果是基于基础的动画,必须要把握几个原则:
接近现实;
保持一致;
提供即时反馈;
使用有意义的过渡功能;
保证连贯。
当然,做动画保持轻松的心态也很重要。
3、整体优化
1. 减少App的电量消耗
移动设备电量消耗是一个众所周知的问题。iOS的电量管理系统通过关闭当前未被使用的所有硬件功能来保存电量。
通过改善以下几个方面使用以提高电池寿命:
CPU
Wi-Fi,蓝牙,3G网络
基于位置的服务
加速计
磁盘
其中最重要的是网络使用优化,把握一个原则:传播到网络上越多的数据,越多电量将被用来跑无线网络。
你可以最小化使用网络的时间使用以下准则:
连接到外部网络服务器只在有需要的时候,不要任意连接这些服务器。
当你必须连接到网络上,传播最少量的数据到网络上来完成这项工作,使用压缩的数据格式,不要包含额外可以不用的数据。
及时传输数据而不是超时传输多个数据包,系统将会关闭Wi-Fi和蜂窝网络当它检测到没有网络活动的时候,当传输数据超过很长一段时间,你的App将会使用很多的电量比起在短时间内传输相同数据。
当使用NSURLSession类入栈多个上传和下载的任务时,同时入栈这些任务而不是等待一个任务执行完才执行下一个任务。系统会自动管理执行已入栈的任务当它认为效率最高的时候。
连接到网络尽可能使用Wi-Fi,比起蜂窝网络Wi-Fi使用较少的电量。
2. 高效使用内存
应用被鼓励于用尽可能少的内存实现功能,因为这样系统可以保留更多的App在内存中或将更多的内存用于真正需要内存的前台App,这里有一个直接关系关于系统空闲内存的数量与你的应用的直接表现:越少的空闲内存意味着系统更加可能在填充将来内存需求时遇到困难,所以App表现得更低效。
3. 监听低内存警告
当系统发起一个低内存警告到你的App,立即响应低内存警告将会是你删除无用相关对象的一次机会。响应这些警告是紧急的,因为如果应用不这样做的话将会被杀掉。
4. 优化文件管理
最小化写入到磁盘的数据量,文件操作是相当的慢也包括写入数据到闪存。有一些具体的提示帮助你最小化文件操作:
只写入文件发生改变的部分,尽量聚集修改到一起,避免写入整个文件只为了修改几个字节。
当定义你自己的文件格式时,频繁分组修改的内容到一起以最小化每次需要写到磁盘的block的数量。
如果你的数据包含随机访问的结构化的内容,保存到Core Data持久化数据或者SQLite数据库。特别是你操作的这些数据可能会增加到很大的字节数。
避免写入缓存数据到磁盘,只有一个例外就是当你的应用即将退出,而你需要写入状态信息以便于下次使用回到应用的相同状态。
4、性能优化
iOS应用需要非常注重用户体验,除了界面设计合理美观以外,也要求各种UI元素的反应灵敏,为了提高iOS的运行速度使用代码段置于NSDate之间,比较时间差是一个不错的主意。
以下提出几点提高性能的技巧:
1. 减少应用启动时间
快速启动应用对于用户来说可以留下很好的印象,尤其是第一次使用时。
注意:在测试程序启动性能的时候,最好与xcode断开的设备进行测试。因为watchdog在使用xcode进行调试的时候是不会启动的。
保证应用快速启动的指导原则:
尽量将启动过程中的处理分拆成各个异步处理流,比如:网络请求、数据库访问、数据解析等等。
避免臃肿的XIB文件,因为它们会在你的主线程中进行加载。Storyboard并没有这个问题,可以放心使用。
2. 尽可能设置 View 为不透明
UIView 有一个 opaque 属性,在你不需要透明效果时,你应该尽量设置它为 YES 可以提高绘图过程的效率。
在一个静态的视图里,这点可能影响不大,但是当在一个可以滚动的 Scroll View 中或是一个复杂的动画中,透明的效果可能会对程序的性能有较大的影响。
3. 缓存
在开发我们的程序时,一个很重要的经验法则就是:对那些更新频度低,访问频度高的内容做缓存。
可以缓存的事物:
服务器的响应信息(response)
使用NSURLCache以及设置请求的缓存策略可以轻易实现。
图片
图片的缓存常用的库有AFNetwork和SDWebImageCache。
计算值
比如:UITableView 的 row heights。预先设置初始值,tableview不用在内容加载的时候才去计算而是刷新,将提高UI显示速度。
4. 光栅化
CALayer 有一个属性是 shouldRasterize 通过设置这个属性为 YES 可以将图层绘制到一个屏幕外的图像,然后这个图像将会被缓存起来并绘制到实际图层的 contents 和子图层,如果很很多的子图层或者有比较复杂的效果应用,使用它将会比重绘所有的事务的所有帧来更加高效。唯一需要权衡的是,光栅化原始的图像需要时间,并且会消耗额外的内存。这点值得注意。
如果我们使用得当时,光栅化将提供很大的性能优势,但内容不断变动的图层上使用例外,因为这样会产生大量无用的缓存,并无法被用来加速,反而会消耗系统性能。
为了检测你是否正确地使用了光栅化方式,可以用 Instrument 的 Core Animation Template 查看一下 Color Hits Green and Misses Red 项目,看看是否已光栅化图像被频繁地刷新(这样就说明图层并不是光栅化的好选择,或则你无意间触发了不必要的改变导致了重绘行为)。
如果你最后设置了 shouldRasterize 为 YES,那也要记住设置 rasterizationScale 为合适的值。在我们使用 UITableView 和 UICollectionView 时经常会遇到各个 Cell 的样式是一样的,这时候我们可以使用这个属性提高性能:
5. 选择合适的数据存储方式:
iOS 中可以用来进行数据持有化的方案:
NSUserDefaults
只适合用来存小数据。
XML、JSON、Plist 等文件
JSON 和 XML 文件的差异在「选择正确的数据格式」。
使用 NSCoding 来存档
NSCoding 同样是对文件进行读写,所以它也会面临必须加载整个文件才能继续的问题。
使用 SQLite 数据库
可以配合 FMDB 使用。数据的相对文件来说还是好处很多的,比如可以按需取数据、不用暴力查找等等。
使用 CoreData
也是数据库技术,跟 SQLite 的性能差异比较小。但是 CoreData 是一个对象图谱模型,显得更面向对象;SQLite 就是常规的 DBMS。
结语
提升iOS应用质量的过程永无止境,但只要专注于从用户的角度思考并解决这些问题。将得到越来越多用户的支持,产品也将更加趋于完美。
本文作者:庄园(点融黑帮),2015年11月加入点融客户端团队参与iOS产品开发。参与多款互联网共享软件创业项目,多年互联网公司从业经验,持续关注互联网创业。