UITableView性能提升和优化(第3章)之二-创新互联

接上一篇翻译的内容。

创新互联拥有一支富有激情的企业网站制作团队,在互联网网站建设行业深耕10多年,专业且经验丰富。10多年网站优化营销经验,我们已为上1000家中小企业提供了成都网站建设、网站建设解决方案,定制网站建设,设计满意,售后服务无忧。所有客户皆提供一年免费网站维护!

再次运行测试

在重用cell之后,你可以再一次测试滚动性能。从表格3-3可以看出,在你正确重用cell之后,性能提升了一倍。

UITableView性能提升和优化(第3章) 之二

表格 3-3 重用cell之后测试的结果

结果显示你的做法是正确的;但是,现在的性能依然不够好。你总是想让性能上升至0.6666-0.0001左右;对于一个标准的UITableViewCell这是一个正常的性能,就像在第一部分展示的那样。所以下一部分将要学习如何重用p_w_picpaths,而不是每次调用的时候都创建一个新的p_w_picpath。

这就是你为什么要重用cell的原因。对于OS来说,创建和加载一个新的cell到内存中,都是要花费时间和内存资源的。这就是为什么tableview总是queue 一个cell进行重用,无论这个cell是否在屏幕之外。如果你重用cell,OS就不需要创建一个新的cell来显示;它只需要获取旧的cell,改变一些属性,然后重新显示这个cell。这个过程比OS创建一个新的cell要快的多。

重用图片

显示图片的主要问题在于加载的时间,要么通过文件系统IO,要么通过网络IO,都是非常耗时的。这个加载过程同样会影响到滚动性能,当iOS不能返回cell来渲染UI时。

由于这个原因,请参考ReuseImageViewController这个给工程。首先我解释一下在这些例子中,我为什么没有使用[UIImage p_w_picpathd:@""]。p_w_picpathNamed做了一项非常重要的工作:它会在内存中缓存图片,当你再次访问的时候会重用它。使用这个方法的问题是它只能从bundle中获取文件 --- 换句话说,图片只能和app的源代码放在一起。通常,你必须调用方法[UIImage alloc] initWithContentsOfFile:@""];或者[UIImage alloc] initWithData:data]]。调用这些方法,OS不会自动的在内存中缓存图片。

所以,我希望你通过一个小的dictionary在内存中存储图片,来自己缓存图片(请看第4章)。另外一个图片处理非常重要的部分是多线程(请看第6章)。使用这个技术,你可以把耗时的的处理任务放到当前线程之外。在我的当前例子中,不会使用多线程,因为你必须立即了解很多新的概念。在本章结束的时候,你应该自己做完这个练习。

这是在NSDictionary缓存图片的主要代码(请不要使用这种方式存储图片,因为它会导致内存警告)。

// Code to store the p_w_picpath in the dictionary- (UIImage *)p_w_picpathWithName:(NSString *)name {

if ([self.p_w_picpathDictionary objectForKey:name]) {return [self.p_w_picpathDictionary objectForKey:name];

}

UIImage *p_w_picpath = [[UIImage alloc] initWithContentsOfFile:name];[self.p_w_picpathDictionary     setObject:p_w_picpath forKey:name];
return p_w_picpath;

}

下面这个是提取最近一次图片的主要代码。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *CellIdentifier = @"CellIdentifier";

  ReuseTableViewCell *cell = (ReuseTableViewCell *) [selfgetCellWithTableView:tableView   cellIdentifier:CellIdentifier nibName:@"ReuseTableViewCell"];

  NSString *avatarFile = [NSString stringWithFormat:@"a0"];
  NSString *avatarName = [[NSBundle mainBundle] pathForResource:avatarFile ofType:@"jpeg"];

  cell.avatar.p_w_picpath = [self p_w_picpathWithName:avatarName];

  cell.userName.text = [NSString stringWithFormat:@"hi here: %d", indexPath.row];// Configure the cell.

  return cell;
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享标题:UITableView性能提升和优化(第3章)之二-创新互联
链接地址:http://scyanting.com/article/djgceo.html