创建NSDateFormatter对象是比较耗时的操作,特别是在tableView滑动过程中大量创建NSDateFormmatter对象将会导致tableView滑动明显卡顿。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellI = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellI];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellI];
}
cell.textLabel.text = [NSString stringWithFormat:@"Item %ld", indexPath.row];
for (int i = 0; i < 30; i++) {
NSString *timeStr = @"20171111 11:11:11";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDate *timeDate = [formatter dateFromString:timeStr];
double time = [timeDate timeIntervalSince1970];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%f", time];
}
return cell;
}
上面的代码在tableView的滑动过程中FPS只有30帧左右,看起来有明显的卡顿。
解决办法:
我们只需要创建一个NSDateFormatter对象,在tableView滑动的过程中复用这个NSDateFormatter对象。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellI = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellI];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellI];
}
cell.textLabel.text = [NSString stringWithFormat:@"Item %ld", indexPath.row];
for (int i = 0; i < 30; i++) {
NSString *timeStr = @"20171111 11:11:11";
static NSDateFormatter *formatter = nil;
if (formatter == nil) {
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
}
NSDate *timeDate = [formatter dateFromString:timeStr];
double time = [timeDate timeIntervalSince1970];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%f", time];
}
return cell;
}
代码改成上面这种后tableView在滑动过程中FPS也一直保持60帧,滑动非常顺畅。