我对任何类型的多线程都不熟悉,似乎无法在后台线程上正确地使用简单的搜索方法。似乎所有东西都与NSAutoreleasePool一致,并且UI在主线程上更新。该应用程序不会崩溃,并在后台执行搜索,但搜索结果会多次生成几个相同的项目,具体取决于我输入的速度。搜索工作正常,没有多线程(已注释掉),但由于我正在处理大量数据,因此速度很慢。这是代码:
- (void)filterContentForSearchText:(NSString*)searchText {
isSearching = YES;
NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];
/*
Update the filtered array based on the search text and scope.
*/
//[self.filteredListContent removeAllObjects]; // First clear the filtered array.
for (Entry *entry in appDelegate.entries)
{
NSComparisonResult result = [entry.gurmukhiEntry compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
[self.filteredListContent addObject:entry];
}
}
[self.searchDisplayController.searchResultsTableView performSelectorOnMainThread:(@selector(reloadData)) withObject:nil waitUntilDone:NO];
//[self.searchDisplayController.searchResultsTableView reloadData];
[apool drain];
isSearching = NO; }
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if (!isSearching) {
[self.filteredListContent removeAllObjects]; // First clear the filtered array.
[self performSelectorInBackground:(@selector(filterContentForSearchText:)) withObject:searchString];
}
//[self filterContentForSearchText:searchString];
return NO; // Return YES to cause the search result table view to be reloaded. }
答案 0 :(得分:0)
有几件事:
答案 1 :(得分:0)
您可能想要了解NSOperation。考虑创建NSOperation的子类,并添加一个作为您发布的文件中实现的类的属性。
然后在 - (BOOL)searchDisplayController:(UISearchDisplayController *)控制器shouldReloadTableForSearchString:(NSString *)searchString {
您可以使用指向搜索数据和文本的指针设置对象。然后你可以检查对象当前是否正在运行(我认为),如果是,请在其上调用'cancel'并使用新的搜索字符串重新开始。可能有一种更聪明的方式,但我怀疑NSOperation是一个开始寻找的好地方。