开发进阶15_性能优化

给局部变量加上关键字:static

作用:不管调用多少次,这个变量将只会创建一次

修改Cell的状态

最好通过“修改模型数据”来修改Cell的状态

修改步骤

修改模型数据

刷新表格

整体刷新:reloadData

局部刷新:reloadRowsAtIndexPaths:withRowAnimation:

删除行数:deleteRowsAtIndexPaths:withRowAnimation:

注意:不管是局部刷新还是整体刷新,原理都是:UITableView重新向数据源(dataSource)和代理(delegate)发送相应的消息,最终将得到的数据展示出来

当定义数据源方法返回每一行显示的数据的时候,需要使用缓存池技术

static NSString *ID = @"C1";

//1.从缓存池中取出可循环利用的cell

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

//2.如果缓存池中没有可循环利用的cell,需要重新创建

if(cell == nil){

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

但数据存储在plist文件中,生成字典使用

同时使用数据模型,这样的话在模型中提供两个方法对对象进行初始化

NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];

NSArray *tempShops = [NSArray arrayWithContentsOfFile:path];

_shops = [NSMutableArray array];

for(NSDictionary *dict in tempShops)

{

shop *s = [[shop alloc] initWithDict:dict];

[_shops addObject:s];

}

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *desc;

@property (nonatomic, copy) NSString *icon;

- (id)initWithDict:(NSDictionary *)dict;

+ (id)shopWithDict:(NSDictionary *)dict;

- (id)initWithDict:(NSDictionary *)dict

{

黄色部分是固定的写法

if(self = [super init]){

self.name = dict[@"name"];

self.desc = dict[@"desc"];

self.icon = dict[@"icon"];

}

return self;

}

+ (id)shopWithDict:(NSDictionary *)dict

{

return [[self alloc] initWithDict:dict];

}

模拟淘宝的商品列表,可以选中多行,进行删除

#import "ViewController.h"

#import "shop.h"

@interface ViewController () <UITableViewDataSource,UITableViewDelegate>

{

NSMutableArray *_shops;

NSMutableArray *_deleteShops;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];

NSArray *tempShops = [NSArray arrayWithContentsOfFile:path];

_shops = [NSMutableArray array];

for(NSDictionary *dict in tempShops)

{

shop *s = [[shop alloc] initWithDict:dict];

[_shops addObject:s];

}

_deleteShops = [NSMutableArray array];

}

#pragma mark - 删除

- (void)remove

{

在进行删除的时候:要么直接将需要删除的数据从数据模型中删除,然后整体刷新

要么将需要删除的行号存储在数组中,然后使用局部刷新

//获得索要删除数据的行号

NSMutableArray *deletePaths = [NSMutableArray array];

for (shop *s in _deleteShops) {

NSInteger row = [_shops indexOfObject:s];

NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0];

[deletePaths addObject:path];

}

//删除数据模型

[_shops removeObjectsInArray:_deleteShops];

//清空准备删除的数组

[_deleteShops removeAllObjects];

//刷新表格数据

//[self.tableView reloadData];

//局部的删除刷新,不需要整个tableView都刷新

[self.tableView deleteRowsAtIndexPaths:deletePaths withRowAnimation:UITableViewRowAnimationTop];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

if(_deleteShops.count == 0){

_removeBtn.enabled = NO;

_titelLabel.text = @"淘宝";

}else{

_titelLabel.text = [NSString stringWithFormat:@"淘宝(%lu)",_deleteShops.count];

_removeBtn.enabled = YES;

}

return _shops.count;

}

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

{

static NSString *ID = @"cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

if(cell == nil){

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

shop *s = _shops[indexPath.row];

cell.textLabel.text = s.name;

cell.detailTextLabel.text = s.desc;

cell.imageView.image = [UIImage imageNamed:s.icon];

//判断勾选状态

if([_deleteShops containsObject:s]){

cell.accessoryType = UITableViewCellAccessoryCheckmark;

}else{

cell.accessoryType = UITableViewCellAccessoryNone;

}

return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

return 70;

}

#pragma mark 监听cell的点击

#pragma mark 选中了某一行就会调用

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

//每个cell都有选中状态(selected)

//是个BOOL类型的值

//1.取消选中这样一行(去掉默认的蓝色背景)

[tableView deselectRowAtIndexPath:indexPath animated:YES];

shop *s = _shops[indexPath.row];

if([_deleteShops containsObject:s]){

[_deleteShops removeObject:s];

}else{

[_deleteShops addObject:s];

}

//2.刷新表格

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];

}

#pragma mark 取消选中了某一行就会调用

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

{

}

@end

时间: 2024-10-18 23:26:49

开发进阶15_性能优化的相关文章

使用ThinkPHP开发中MySQL性能优化的最佳21条经验

使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询大多数的MySQ

【Android开发】Android性能优化

Android性能优化 根据Android的层次结构,性能优化也是分层次进行的,本文会分别对Application.Framework.Native.Kernel各层做总结,每层主要会从性能优化的基本思想.优化技巧.优化工具几个方面进行说明. 第一章Android应用性能优化(概述) 应用程序的性能问题是最明显.最容易体现的一类,表现形式也五花八门,举几个例子: 应用程序第一次启动速度慢,或者进入某一界面速度慢: 启动某一有动画效果的界面,动画执行过程不流畅,或者动画执行前卡顿时间长: List

Android开发中的性能优化---代码

前 这篇主要总结一些优化代码的技巧,一些写代码中的小细节,可能就会影响程序的执行效率,比如一个地方只会影响1ms,那么1000个地方就会影响1s,1s到底长不长?要知道Activity出现ANR异常的时间为5s!!!  主要遵循两个原则  1.不要创建一些没必要创建的对象以及重复定义某个变量  对象的创建是一个非常繁琐的步骤,JVM首先会对通过new指令对符号进行解析,以此来判断该类是否被加载,然后在堆中进行内存分配,为对象分配完内存空间后,就会对内存区域进行初始化(该为0的为0,该为null的

【原创】结合公司网站首页,谈前端模块化开发与网站性能优化实践

说在前面 上午给大家分享的个人认为比较全,比较官方,比较清晰的grunt使用教程,被挪出首页了,不过没关系,毕竟不是原创,大家想看,我现在贴出地址: http://www.cnblogs.com/sybboy/p/4877055.html 下面可是我自己的东西,算是这段时间搞前端架构的总结吧: 目录 1.遇到的问题 2.目标 3.如何解决 4.结果分析 5.尚未解决 6.说在后面 遇到的问题 问题1----脚本混乱,没有层次和固定代码位置 问题2----脚本和css请求较多,请求未压缩,文件未压

Android开发中的性能优化---布局

1.基础 Android中所有的View都是"画"在手机屏幕上的,系统是每隔16ms更新一次Activity中的内容,所以为了让用户看不到卡顿,就要想尽一切方法来让界面在16ms内更改完成,遵循的原则其实只有一个-----尽量的少画东西,这样效率当然就会提高,至于什么减少布局层次,避免重复绘制,总结下来还是尽量少画东西.    为什么是16ms?因为现在市面上的手机一般都是60hz的,所以 16ms/ 帧 ≈ 1s / 60hz 2.方法 使用手机中的开发人员工具--->调试GP

WebPack实例与前端性能优化

[前端构建]WebPack实例与前端性能优化 计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提

【前端构建】WebPack实例与前端性能优化

计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提升团队协作,以及工程运维,避免人工处理琐碎而重

iOS性能优化之“优化总体原则”(性能优化很重要,为什么你们都没有用?)

笔者由于在iOS开发过程中做过一些优化的工作,对iOS性能优化有一些粗浅的认识,一直想把自己这些经验,简单总结一下. 作为整个系列的第一篇,我打算针对iOS的优化中的一些总体原则做一些总结.因为我觉得无论列表流畅度优化也好.启动时间优化也好还是说其他方面的优化,都有一些共性的原则,只有掌握了这些总体性的原则,才能够更好的做优化,给我们具体的优化任务指明方向,让我们少绕弯路.后面如果时间允许,我可能会写一些关于列表流畅度.启动时间和内存优化等方面的文章. 作为一个开发者,有一个学习的氛围跟一个交流

Android:应用开发进阶必经之路之性能优化(上)

前言 性能优化在一款产品的迭代过程中非常重要:程序实现了功能.还原产品原型只能保证程序能用,但如果要让用户更愿意使用,产品得好用.试想一下如果你开发的产品启动慢.页面显示需要长时间转圈加载.页面切换卡顿.黑白屏.用一会机器就发烫.耗内存.OOM.程序切换到后台后占用内存无法释放......,这些问题就像正在玩游戏时弹出提示框这类糟糕的用户体验一样让用户恼火,如果用户不得不使用你的产品,可能还会一直忍受:但如果有很多同类竞品,糟糕的用户体验会大大影响留存率.有时候产品在市场上的表现差,真不能全怪产