UITableView:创建索引的最高效方式?

Posted

技术标签:

【中文标题】UITableView:创建索引的最高效方式?【英文标题】:UITableView: most performant way to create index? 【发布时间】:2017-05-05 06:52:21 【问题描述】:

我有一个相当大的 UITableView(大约 10k 个条目),我需要一个索引并且它应该是可排序的;在旧设备(例如 iPhone 4s、iPhone 5)上,它有时会在搜索过程中挂起一点,因为我总是需要重新创建索引。

我不需要本地化,但UILocalizedIndexedCollation 还是要走的路吗?还是有一个标准的 ios 东西来创建性能索引?

【问题讨论】:

你现在如何创建索引? 【参考方案1】:

1、也许你应该尝试保存索引高度之前,你可以创建一个框架模型,并保存你的索引框架,每次创建索引都会使用你之前创建的框架数据例如

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
NSDictionary *dict = self.dataList[indexPath.row];
CGRect rect = [dict[@"frame"] CGRectValue];
return rect.frame.height;

那么您可以使用此模式来创建单元格。

2、你说我需要创建这么多单元格,我不知道你使用什么数据源,但是如果使用网络数据,并且异步加载,你的应用程序可能会打开这么多队列运行,当你滚动或者当你的网络不是那么大时,它会很糟糕,所以我建议你应该重新创建数据加载方法,当你快速滚动时,只加载这个区域周围的单元格,当你慢慢滚动时,你可以在数据源中异步加载图像和文本, 你可以使用 uiscrollviewdelegate 函数来做这件事

NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
    for (NSIndexPath *indexPath in visiblePaths)
    //get cell you can see
    
    //get datasource object,when object loading complete,stop loading.
         <code>
    

when tableview stop scroll,loading image
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

     if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
        
           //star loading image,async
            <code>
        

【讨论】:

"large" 不是指高度,而是指条目数量:) 对不起,我的英语不好,我的意思是你有很多数据需要加载,你可以试试这个

以上是关于UITableView:创建索引的最高效方式?的主要内容,如果未能解决你的问题,请参考以下文章

《高性能MySQL》读书笔记之创建高性能的索引

如何使用动态单元格高度和自动布局以编程方式创建一个非常基本的 UITableView?

从 NSArray 为 UITableView 创建索引

React-Native 中动态样式的最高效方式是啥?

UITableview 从数据数组创建字母索引

如何为uitableview的所有行和所有部分创建索引路径?