2

我在 SQLite 数据库中有大约 2000 行。每行都有一个整数 ID 和一个字符串值。我想将它们填充到带有字母索引的 UITableView 中,就像联系人应用程序一样。

在不使用 CoreData 的情况下实现与联系人应用程序一样好的性能是否可行,前提是我不需要重新实现 CoreData 为您所做的一切(例如缓存等)?

我尝试使用每页 50 行的分页来实现这一点,并在 tableview 滚动超过 25 行时在另一个线程中预加载下一页。如果滚动不是很快,则此方法有效,但在滚动非常快时仍然滞后。我认为填充 50 个项目的临时 NSArray 的步骤需要很长时间。

此外,这种方法不适用于 UITableView 的索引,因为加载是按顺序完成的,而索引会跳过。我考虑过在初始化时为每个索引键加载前 10 行,但同样会很慢(填充一个包含 260 个项目的数组)。

有什么建议么?

4

2 回答 2

0

我仅以 AZ 为例

取表中的 26 节。

将有 26 个查询来获取数据,首先是从 A 开始,第二个是从 B 开始,第三个是从 C 开始......并且在 cellForRowAtIndexPath() 中直到 Z。

直到用户不滚动表格,它才会获取其他 alpha 投注的数据。

如果每个 From A 到 Z 包含 100 个名称(文本)。

仍然不会花费太多时间。

希望你能从这里得到想法..

于 2012-05-21T20:10:24.317 回答
0

看起来一次获取几千行的性能应该不是什么大问题(你应该能够预取它们)。

我会在您的表上为您想要的任何列异步运行 SELECT(例如供参考的索引,也许只是要显示的字符串)并将它们放入NSMutableDictionary索引的键控中,然后重新加载表数据。该cellForRowAtIndexPath UITableViewDataSource函数将使用此字典。

如果您允许用户选择一行来查看详细信息,那么您可以在选择时针对该行的其余数据运行查询。

在用户查看表格时异步执行初始获取ViewDidLoad或将防止 UI 锁定,并且在几乎所有情况下,一旦他们实际看到表格,表格应该已经可见。ViewWillAppear

初始提取(在后台线程上执行,然后在主线程上重新加载表)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^()
               {
                    //perform your query here
                   dispatch_async(dispatch_get_main_queue(), ^()
                                  {
                                    [self.tableView reloadData]
                                  });
               });
于 2012-05-21T19:43:58.070 回答