Iphone Sqlite+80K行+LIKE=键盘滞后
我有一个一直拖延解决的问题,但现在是时候了 我有一个基本的字典程序。它有一个UISearchBar和一个UITableView。它的工作方式应该是,除非在设备上运行时会导致键盘延迟。模拟器很好,当然我有两种类型的搜索。当您输入和返回时。我发现两者返回结果所需的时间大致相同,但输入时的时间会使键盘滞后 我有一个UISearchBar textDidChange,它接受searchText并将其发送给一个搜索方法,该方法执行所有sqlite提升,将结果放入一个数组中。用户重新加载表格Iphone Sqlite+80K行+LIKE=键盘滞后,iphone,sqlite,keyboard,performance,sql-like,Iphone,Sqlite,Keyboard,Performance,Sql Like,我有一个一直拖延解决的问题,但现在是时候了 我有一个基本的字典程序。它有一个UISearchBar和一个UITableView。它的工作方式应该是,除非在设备上运行时会导致键盘延迟。模拟器很好,当然我有两种类型的搜索。当您输入和返回时。我发现两者返回结果所需的时间大致相同,但输入时的时间会使键盘滞后 我有一个UISearchBar textDidChange,它接受searchText并将其发送给一个搜索方法,该方法执行所有sqlite提升,将结果放入一个数组中。用户重新加载表格 - (void
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
if((searchType == SEARCH_AS_YOU_TYPE) && ([searchText length] >= 2)){
NSString *myKeyword = [NSString stringWithFormat:@"%@", searchText];
[self search:myKeyword];
[myTableView reloadData];
}
}
我把结果限制在50。我的SQL查询使用了类似的And和OR,目前还没有解决这个问题的方法
SELECT WORD_ID, DEFIN, PINYIN, SIMP, TRAD from WORDS where DEFIN LIKE "%to dog %" OR DEFIN LIKE "%dog" OR DEFIN LIKE "%dog%" ORDER BY DEFIN LIMIT 50
我还尝试将[myTableView reloadData]移动到搜索方法中,希望键盘至少不会滞后。没有快乐。不幸的是,我知道sqlite基本上是在检查每一行,当它使用like操作符时。但是80排的3-4秒似乎有点慢
如有任何想法、想法、意见或建议,将不胜感激 我猜SQLite是如何执行该查询的: 查找与您的LIKE语句之一匹配的所有行 按定义分类 截断前50行之后的结果
我怀疑真正痛苦的部分是那种;如果不这样做,它只需收集找到的前50个匹配行。你能不把这些定义分类吗?我觉得你在同一个线程中搜索并准备好键盘。这样,您将搜索尽可能多的字符,并且键入速度仅限于搜索速度 正确的解决方案是将其分为两个线程,一个用于读取和显示键盘,另一个用于搜索和显示搜索结果。这样,如果您键入的速度比搜索速度快,则只有搜索会滞后,而不是键入。例如,Firefox地址栏就是这样工作的
由于这两个线程以及它们之间的通信/协调,您的代码将更加复杂,但我认为这是唯一好的解决方案。尝试在不同的线程中进行搜索查询。由于UI操作仅在主线程上执行,因此在主线程上执行的任何耗时操作都会延迟UI操作。因为您使用的是LIKE sqlite,因此不会使用索引,它将从开始到结果集中达到50条记录的限制为止顺序扫描。根据数据的顺序,在最坏的情况下,它可能在开始或结束时达到前50个结果 你可以创建一个新的列来存储defin ie d中每个基本单词的第一个字母,然后为这个列编制索引 修改查询以从单词中选择*,其中firstletter=:firstletter order by defin limit 50 这将大大减少您的搜索空间 将使用like运算符进行完全匹配 您也可以对数据进行预排序,这样就不需要order by,我怀疑order by将导致扫描整个表,而不是在命中我通常使用的前50条记录时终止
[self performSelectorInBackground:@selector(threadedFetch) withObject:nil];
结合Core Data的NSFetchedResultsController,在用户搜索输入时启动提取。但在踩踏时要小心。为每个线程使用单独的NSManagedObjectContext,或使用-[NSManagedObjectContext lock]锁定单个上下文