搜索栏挂在iphone上,但在模拟器上运行良好
我的应用程序大约有200行UITableView,当我使用xcode上的模拟器通过UISearchBar过滤数据时,它会立即过滤并显示结果。然而,当我在iphone(iphone4,iOS 5.1.1)上运行我的应用程序时,它会挂起几秒钟,然后再显示任何搜索结果。我正在使用此代码筛选数据搜索栏挂在iphone上,但在模拟器上运行良好,iphone,ios,uisearchbar,Iphone,Ios,Uisearchbar,我的应用程序大约有200行UITableView,当我使用xcode上的模拟器通过UISearchBar过滤数据时,它会立即过滤并显示结果。然而,当我在iphone(iphone4,iOS 5.1.1)上运行我的应用程序时,它会挂起几秒钟,然后再显示任何搜索结果。我正在使用此代码筛选数据 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ [self.filteredData remov
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
[self.filteredData removeAllObjects];
if ([searchText length] > 0) {
self.isSearching = YES;
for (AClass *filteredData in self.allData) {
NSRange titleResultRange = [filteredData.name rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch];
if (titleResultRange.location != NSNotFound) {
[self.filteredData addObject:filteredData];
}
}
}
else self.isSearching = NO;
[self.tableView reloadData];}
我相信我的代码是可以的,因为它在模拟器上运行得非常好,我需要做些什么才能让它在iphone上运行得更快?
顺便说一句,我的iPhone运行得很好,我使用其他应用程序,它们对我来说运行得很好。你的设备比模拟器花费的时间更长的原因是可用的内存量。一般来说,不要在模拟器中使用应用程序的性能来判断应用程序的性能 如果您按照您描述的方式过滤一个非常大的数据集,我建议您使用调度队列来执行搜索,而不是在主队列中进行搜索。您可以在此处阅读有关它们的信息: 如果您不想阅读整个文档,下面是一个示例,说明您的代码是什么样子的
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
[self.filteredData removeAllObjects];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([searchText length] > 0) {
self.isSearching = YES;
for (AClass *filteredData in self.allData) {
NSRange titleResultRange = [filteredData.name rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch];
if (titleResultRange.location != NSNotFound) {
[self.filteredData addObject:filteredData];
}
}
}
else self.isSearching = NO;
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
}
请注意,我给你的例子不是线程安全的。。。您需要确保在任何给定时间只执行一次搜索,否则此代码将崩溃,因为同一数组将在多个队列中引用。如果你需要更多的帮助,请留下评论,我会尽力去做