我的iphone App显示了包含6000个项目列表的表格视图。 (这些项目在SQLite文件中)
用户可以搜索这些项目。但是,当我点击搜索栏&开始输入第一个字母,我输入第二个字母需要很长时间。同样,在我开始搜索之前输入每个字母需要很长时间。
有没有办法提高搜索工具栏的输入速度,以便用户可以快速输入5-6个字母进行搜索?
感谢您的帮助。 谢谢!
答案 0 :(得分:6)
如果搜索太慢并因此阻止了UI,则应异步执行搜索,以免阻塞主线程。为此,有很多选项,包括Grand Central Dispatch(4.0 +),NSOperation
,performSelectorInBackground:...
。最适合您的方法取决于您的应用程序/算法的架构以及您最熟悉的内容。
修改:要开始,请阅读performSelectorInBackground:withObject:
和performSelectorOnMainThread:withObject:waitUntilDone:
的文档。从搜索栏委托方法,尝试调用类似:
// -searchForString: is our search method and searchTerm is the string we are searching for
[self performSelectorInBackground:@selector(searchForString:) withObject:searchTerm];
现在Cocoa将创建一个后台线程并在该线程上调用自定义-searchForString:
方法。这样,主线程将不会被阻止。自定义方法应如下所示:
- (void)searchForString:(NSString *)searchTerm
{
// First create an autorelease pool (we must do this because we are on a new thread)
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Perform the search as you normally would
// The result should be an array containing your search results
NSArray *searchResults = ...
// Pass the search results over to the main thread
[self performSelectorOnMainThread:@selector(searchDidFinishWithResult:) withObject:searchResults waitUntilDone:YES];
// Drain the ARP
[pool drain];
}
现在,自定义方法searchDidFinishWithResult:
负责使用搜索结果更新UI:
- (void)searchDidFinishWithResult:(NSArray *)searchResult
{
// Update the UI with the search results
...
}
这可能是一个开始最简单的方法。解决方案还没有完成,部分原因是如果用户输入的速度比搜索完成的速度快,搜索任务就会堆积起来。您应该合并一个等待一段时间的空闲计时器,直到搜索被解雇或者您需要取消正在进行的搜索任务(NSOperation
在这种情况下可能会更好)。
答案 1 :(得分:1)
不是每次调用“textDidChange”时都搜索整个列表,而是仅在调用“searchBarSearchButtonClicked”时搜索它?
你放弃了自动更新为他们的类型,但它不会造成你每次都看到的延迟。
答案 2 :(得分:0)
我不知道您的表是否已编入索引。如果没有,您应该为表创建索引。表的更新速度会更慢,但搜索速度会更快。 祝你好运。