由于titleForHeaderInSection导致iOS性能下降

时间:2016-09-29 21:18:49

标签: ios swift performance uitableview

我有一个计算卡路里的应用程序。用户输入他们的卡路里(每个食物在TableView中变成一行。每个部分代表一天。

我有一个章节标题,可以添加当天的所有卡路里。

现在我有一年的投入,加载应用程序的性能很慢(大约需要5秒)。我用过仪器,负责的方法是titleForHeaderInSection。我发现的问题是当tableview加载时(不仅仅是显示的部分),每个部分都会调用此方法。

有没有解决这个问题?我很想每天显示总数。

1 个答案:

答案 0 :(得分:0)

如果您对标题的计算有点“昂贵”,那么您需要一种方法来推迟计算。没有什么好方法可以知道何时调用import {Component, ViewEncapsulation} from '@angular/core'; import {DataService} from '../shared/services/DataService'; import {Widget} from '../core/widget/widget'; import {TablesBackgrid} from './tables-backgrid/tables-backgrid'; import {DataTableDirectives} from 'angular2-datatable/datatable'; import {SearchPipe} from './pipes/search-pipe'; declare var jQuery: any; import {Router,ActivatedRoute} from '@angular/router'; import {IAccounts} from '../shared/interfaces/IAccounts'; import {Profile} from '../profile/profile'; import { ROUTER_DIRECTIVES } from '@angular/router'; const Agents = []; @Component({ selector: '[account-list]', template: require('./account-list.html'), encapsulation: ViewEncapsulation.None, directives: [Widget,TablesBackgrid, DataTableDirectives,ROUTER_DIRECTIVES], styles: [require('./account-list.scss')], pipes: [SearchPipe] }) export class AccountList { agents: any[]; router:Router; constructor(ds:DataService) { let test = ds.getAccounts().then(res => { this.agents = res.agents; }); } loadProfile(id){ this.router.navigate(['/profile']); } ngOnInit(): void { let searchInput = jQuery('#table-search-input, #search-countries'); searchInput .focus((e) => { jQuery(e.target).closest('.input-group').addClass('focus'); }) .focusout((e) => { jQuery(e.target).closest('.input-group').removeClass('focus'); }); } } 来真正显示标题以及何时调用它只是为了设置表格视图。

一种解决方案是将titleForHeaderInSection替换为titleForHeaderInSectionviewForHeaderInSection

诀窍是只在标题视图实际添加到表视图时设置标题视图的文本。这可以在自定义标题视图类的heightForHeaderInSection方法中完成。如果superview为非nil,则视图将添加到其父视图中。您需要一种方法来使用该方法来实际计算标题的文本。

正如评论中所指出的,另一种可能的解决方案是仅计算每天的总数并存储该值。然后在表视图中加载数据时,您不需要进行任何计算。只需使用预定值。