一些性能上的考虑(主要是UITableView)

开发中遇到了这样的场景:

一个应用的首页,使用的是UITableView来构建,在滑动到某个地方的时候,不同的机器有不同的表现:

1.iPhone4,卡得惨不忍睹

2.iPhone4S,明显的卡顿

3.iPhone5,有肉眼能够观察到的细微停顿

4.iPhone5S,手指滑动能够细微感觉到不流畅

 

这个页面上的元素算是非常丰富,尤其是在卡顿的地方,有以下几个特点:

1.主要问题之一,出现了5种不同的cell

2.主要问题之一,顶部导航栏做了图片模糊处理(毛玻璃半透明效果)

3.图片较多

4.图片较大(图片比实际显示的大小要大很多)

5.图片圆角处理

 

于是逐步开始优化,走的路线并不纯粹是从程序角度来考虑的

1.该页面实际上有10数种不同的cell,于是把所有的cell放在获取网络数据以后就完成初始化

NSMutableArray *headerCellArray = [NSMutableArray array];

for (int i = 0; i < data.count; i ++) {

  [headerCellArray addObject:[[[NSBundle mainBundle] loadNibNamed:@"headerCell" owner:nil options:nil] lastObject]];

}

之后在

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  cell = [tableView dequeueReusableCellWithIdentifier:@"headerCellId"];

      if (!cell) {

        cell = [_headerCellArray objectAtIndex:row];

      }

}

这样其实是一种投机取巧的办法,就是把加载CellNib的卡顿放在页面初始化中一次性完成,以内存换体验。

然后测试,以表现最烂的iPhone4为例,进入此页面的时候,会出现约有1秒的卡顿加载,之后滑动tableview所造成的卡顿极大程度上得到了缓解。

 

2.判断机型和系统版本,在iPhone4(S)和iOS6上去掉图片模糊毛玻璃效果,当然这是和UI讨论过的,卡顿极大程度上得到了缓解。

 

3.接下来的问题是:每一次进入这个页面都会很卡,这怎么办?

这里我的处理方式是和设计讨论,能否修改设计方案,即:不做自动刷新数据,在这个页面采用手动下拉刷新(或者是其他手动的方式)来做新数据的获取。

这样的话,我就可以将这个UIViewControlelr持久保存在内存中不释放,而不是每次都需要重新ViewDidLoad来加载页面元素。

最后的结果是:只会在程序初始化的进入此页面的时候卡顿约1秒,之后就不会再构建它---更改设计,在很多时候其实是很好的办法,关键是沟通。

 

4.图片较多的问题则很难处理,这是各方设计的结果,不过沟通也很重要,也许有一些板块(cell)实际上是不需要加载图片的,当然图片的延迟加载是每个开发都在使用的,这没什么好说的。

 

5.我发现了某台iP4在加载图片的时候特别卡(其他的iP4会好一些),这应该是设备老化的问题,但同样给了我一些启示:

比如我在某个Cell中显示的是48*48的图片(URL),我在网页中打开并下载该图片,发现实际的大小居然是640*640,整个页面中不少这样的图片规格严重超标的问题,于是这个问题就扔给了数据编辑的同事处理。

处理完毕以后,终于,这个页面,可以勉强不用“卡”这个字来形容了,只是不流畅而已。

 

其实我的意思是,很多时候性能上的问题并不光是程序的问题,设计的问题多数时候更为严重,这个时候,大家一起想办法总比程序员自己一个人苦憋着效果要好很多。

 

最后的结果是

产品:你这个程序在这台iP4上不太流畅,别人的应用也是这样么?

程序:得了吧,你这台iP4打开AppStore搜索某个关键词试试。

然后产品不说话了。

事实是这台iP4打开AppStore以后就卡得不动了,而我们的程序只是“有些不流畅”而已,那是不是说明我们的代码比AppStore要写得好呢?显然不是的,这只是一个小插曲,哈哈。

posted on 2014-09-23 14:58  静如树  阅读(276)  评论(0编辑  收藏  举报