我在SQLite数据库中有大约2000行。每行都有一个整数ID和一个字符串值。我想将它们填充到UITableView中,其字母索引与“联系人”应用程序一样。
在不使用CoreData的情况下实现与Contacts应用程序一样好的性能是否可行,只要我不需要重新实现CoreData为您做的所有事情(例如缓存等)?
我尝试使用每页50行的分页来实现这一点,并在tableview滚动超过25行时在另一个线程中预加载下一页。如果滚动不是很快,但是当它滚动得非常快时,它仍然会滞后。我认为填充50件临时NSArray的步骤需要很长时间。
此外,这种方法对于UITableView的索引不能很好地工作,因为加载是按顺序完成的,而索引会跳过。我想在初始化时为每个索引键加载前10行,但同样,它会很慢(填充一个包含260个项目的数组)。
有什么建议吗?
答案 0 :(得分:0)
看起来同时获取几千行的性能应该不是什么大问题(你应该只能预取它们)。
我会在你的表上异步运行一个SELECT,用于你想要的任何列(比如引用的索引,也许只是要显示的字符串),然后将它们放入键入索引的NSMutableDictionary
,然后重新加载表数据。 cellForRowAtIndexPath
UITableViewDataSource
函数将使用此字典。
如果允许用户选择行以查看详细信息,则可以在选择时对该行的其余数据运行查询。
在ViewDidLoad
或ViewWillAppear
中异步执行初始提取将阻止UI在用户查看表时锁定,并且在几乎所有情况下,表实际上都应该已经可见桌子。
初始提取(在后台线程上执行,然后在主线程上重新加载表)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^()
{
//perform your query here
dispatch_async(dispatch_get_main_queue(), ^()
{
[self.tableView reloadData]
});
});
答案 1 :(得分:0)
我仅以A-Z为例
在表格中取26节。
将有26个查询来获取数据 首先从A开始 第二个是从B开始 第三个是从C ......开始,然后是从Z开始 在cellForRowAtIndexPath()。
直到用户不滚动表格,它才会获取其他alpha赌注的数据。
如果每个从A到Z包含100个名称(文本)。
仍然不会花太多时间。
希望你能从这里得到想法..