版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】UITableView性能提升和优化(第3章)之一
在本章,你将做下面这些事情:在实例中使用第2章介绍的测试工具在例子中一步一步的对滚动性能进行优化使用以下技术对UITableView进行优化
1)
使用基本的技术优化UITableView中简单的cells
2)
通过代码使用核心技术在cell中绘制view
3)
使用基本的技术来优化需要像正在编辑,重排序等动画的cell
4)
开发者需要知道的一些其他技术iPhone应用程序通常通过列表的形式来显示数据。苹果为开发者提供了非常好用的工具:UITableView和UITableViewCell。如果开发者只是想使用一些基本的功能,如在左边显示一张小图片,中间显示文本,那么苹果提供的默认控制就能够很好的满足要求了。但是如果你想自定义一些东西,比如显示2张或3张图片,把文本放在不同的地方,你就会遇到问题。如果这样的话,你迟早会遇到UITableView性能方面的一些问题,尤其是在像iPhone3G这种老设备上。例子介绍在这个例子中,我会基于两个主要因素来衡量性能:UITableViewdequeue一个cell,创建一个cell的速度,或cell返回给操作系统的速度;操作系统渲染你的cell,然后显示在机器上的速度。第一个使用NSLog就可以测量出来;第二个比较复杂,只能通过CoreAnimation进行测量。我将用两个不同的例子来说明问题。一个只包含了图片和文字;另一个包含了很多复杂的子view。通过这两个例子,你会发现有很多不同的方法来优化UITableView滚动时的性能。在本章结束时,我会列出很多重要的知识点,由于时间有限,我不会做详细的介绍。这些并不是一些常见的错误,但是如果某个开发者因为粗心而犯了其中的一些错误,有可能花上一整天的时间测试和查找问题。我想确保你已经有足够的技能和知识来处理各种情况。有时候优化非常简单,只需要在代码中做一些小小的改动。然而在其他情况下,比如第二个例子,你需要重写整个代码来,从而达到更好的性能。我希望在例子介绍完后,你对整个程序的架构有一个非常清晰的认识,这样你在开始的时候就能够做出正确的决定,而不需要重写代码。复习测试工具在本章,你将使用CoreAnimation工具对iphoneOS的渲染性能进行测试。这能帮助你了解问题是出现在计算过程中还是在显示过程中。第2章已经介绍了这个工具,所以本章只进行一个简短的回顾。图3-1显示了CoreAnimation工具的主视图,运行时有3个部分你需要观察,图3-2显示了性能的参数值。图3-1CoreAnimation工具的主要部分图3-2最近的性能显示第一个例子第一个例子将会一步一步的展示如何优化UITableView的滚动性能。最初版本的源代码包含了我从很多开发者那边搜集到的性能使用上的错误。在这个过程中,你会看到在每一步优化后,性能都会有所提升。介绍第一个例子如图3-3,你有一个普遍而又实际的问题,那就是你需要开发一个UITableView,在每一个cell中有一张图片和一个文本块。我将带你查看这个例子的源代码。让我们看一下类似Facebook的应用;应用需要一张图片显示头像,需要另一张图片显示用户分享的链接内容。这个应用同样也需要一张更小的图片来显示cell中的图标。在第一个测试中,请参考SlowPerformanceTableView这个工程。图3-3第一个例子的应用标准测试在项目开始之前,你必须知道你的最终目标;在这个例子中,你要达到的目标就是有一个很好的性能,当在滚动和使用你的应用时,你可以带给用户一个很好的体验。因此,通过运行一个正常的没有自定义的UITableViewCell,它会按需加载一张简单的图片并会对图片进行重用,表格3-1显示了运行时的日志。表格3-1运行例子的结果用CoreAnimation进行测试,每秒渲染的帧数(fps)的最佳性能是60fps(数字越高,性能越好)。对于一个标准的UITableViewCell,通常的速度在55-60fps之间;这应该是你的目标之一。另一个目标是确保预加载的时间足够的小。当总体时间减少了,cell预加载的时间同样会减少。但是,减少cell预加载的时间更简单,因此在这个例子中,主要集中在如何减少预加载的时间。初始化测试在第一个例子中,我运行了一个初始化的测试,得到了6个cell滚动时的随机结果。表格3-2显示了测试性能的结果(使用了NSLog和CoreAnimation)。表格3-2第一个例子初始化测试的结果从结果中可以看出,绘制和返回一个cell通常需要10毫秒的时间。由于这个时间是非常巨大的,通常的测量(fps)同样也会降低效率。因此,我的第一个目标就是减少这个过程的预加载时间。源代码中有一个需要注意的地方:[UIImagep_w_picpathNamed:name]和[[UIImagealloc]initWithContentsOfFile:name]之间的区别。稍后我会解释他们的不同以及为什么用p_w_picpathNamed代替initWithContentsOfFile。重用UITableViewCell优化UITableView通常是非常简单的;你需要做的就是检查是否用正确的方式重用UITableViewCell。创建一个UITableViewCell对于iOS来说是一个CPU密集型的过程。因此,如果用户上下滚动的时候每次都要创建一个新的cell,整个性能将会下降。苹果的标准(默认)的方式就是:无论cell是否在屏幕之外,都重用这个cell,从而加速这个过程。标准的UITableViewCell对于标准的UITableViewCell,通用的代码实际上可以工作的很好,能够给你一个快速的滚动性能。-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{
staticNSString*CellIdentifier=@"Cell";
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];}注意reuseIdentifier:CellIdentifieranddequeueReusableCellWithIdentifier:CellIdentifier的使用。这两部分会帮助你正确的重用UITableViewCell。有两种主要的方法创建一个自定义的cell,要么使用InterfaceBuilder,要么通过调用addSubview:方法,然后自己写代码来创建。使用InterfaceBuilder创建自定义UITableView当使用InterfaceBuilder的时候,开发者通常会忘记设置identifier,实际上这个设置是非常简单的。可以通过打开xib文件,转到第一个tab,对第一行进行修改来改变identifier的值,如图3-4。图3-4为cell设置重用的identifier现在,在cell的初始化代码中,你必须明确的使用相同的identifier。-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{
staticNSString*CellIdentifier=@"CellIdentifier";//mustmatchtheoneinInterfaceBuilder
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];if(cell==nil){
cell=[[UITableViewCellalloc]
initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];}通过代码自定义UITableView如果你不想用interfacebuilder,而是用代码构建自定义的cell,你可以在你自定义的类ReuseTableView中返回它。TableCellViewController.h@interfaceTableCellViewController:UITableViewCell{}@endTableCellViewController.m#import"TableCellViewController.h"@implementationTableCellViewController-(NSString*)reuseIdentifier{
return@”CellIdentifier”;}@end注意:这两种方法的主要不同之处在于加载和初始化你的UITableView。确保你能够理解这两个例子的不同之处,我将会向你展示主要的代码。从Nib文件加载Cell首先,你需要用代码从文件系统中加载nib文件到内存中,然后解析出给UITableView对象。-(UITableViewCell*)cellWithTableView:(UITableView*)tableViewcellIdentifier:(NSString*)cellIdentifiernibName:(NSString*)nibName{
UITableViewCell*textCell=[tableViewdequeueReusableCellWithIdentifier:cellIdentifier];
if(textCell==nil){
NSArray*topLevelObjects=[[NSBundlemainBundle]loadNibNamed:nibName
owner:niloptions:nil];
for(idcurrentObjectintopLevelObjects){
if([currentObjectisKindOfClass:[UITableViewCellclass]]){
textCell=(UITableViewCell*)currentObject;
break;
}
}
}
returntextCell;}你可以使用以下代码,调用cellWithTableView:cellIdentifier:nibName:从nibTableViewController加载stableview:ReuseTableViewCell*cell=(ReuseTableViewCell*)[selfgetCellWithTableView:tableViewcellIdentifier:CellIdentifiernibName:@"ReuseTableViewCell"];这个代码不是完美的;你需要修改成你自己的nib文件确保一切运行顺利。但是,我的目的是确保你能够区分这两种方式,所以我没有讨论过多的细节。从自己的代码中加载cell-(id)initWithStyle:(UITableViewCellStyle)stylereuseIdentifier:(NSString*)reuseIdentifier{
self=[superinitWithStyle:stylereuseIdentifier:reuseIdentifier];
if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市绿化合同管理办法
- 宗教艺术博物馆管理办法
- 一站式工程维护服务承诺书
- 车辆限号管理办法
- 美容院实习生转正合同
- 城市供电设施拆迁电力保障
- 生态养殖场养猪场租赁
- 城市绿化箱涵施工合同
- 产品售后服务承诺书协议书
- 建筑照明工程合同
- 村落徽州徽派民居建设技术导则(2023年版)
- 发改委事业单位聘用协议书
- 2024版职业发展规划医疗人员的成长路径和晋升机会培训课件
- 基督教追悼会悼词 一个母亲去世追悼词3篇
- 工程造价审计投标方案(技术标)
- PaaS开发运营三级理论考试题库(汇总)
- Creo-7.0基础教程-配套课件
- 幼儿园玩具安全教育(儿童版)
- 《国家基本专业档案目录》解读
- 网课-文化之旅答案
- 马克思主义经典著作选读智慧树知到课后章节答案2023年下四川大学
评论
0/150
提交评论