如何提高Iphone SDK的搜索速度

时间:2010-11-16 18:30:12

标签: iphone objective-c iphone-sdk-3.0 ios4

我的iphone App显示了包含6000个项目列表的表格视图。 (这些项目在SQLite文件中)

用户可以搜索这些项目。但是,当我点击搜索栏&开始输入第一个字母,我输入第二个字母需要很长时间。同样,在我开始搜索之前输入每个字母需要很长时间。

有没有办法提高搜索工具栏的输入速度,以便用户可以快速输入5-6个字母进行搜索?

感谢您的帮助。 谢谢!

3 个答案:

答案 0 :(得分:6)

如果搜索太慢并因此阻止了UI,则应异步执行搜索,以免阻塞主线程。为此,有很多选项,包括Grand Central Dispatch(4.0 +),NSOperationperformSelectorInBackground:...。最适合您的方法取决于您的应用程序/算法的架构以及您最熟悉的内容。

修改:要开始,请阅读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)

我不知道您的表是否已编入索引。如果没有,您应该为表创建索引。表的更新速度会更慢,但搜索速度会更快。 祝你好运。