我的应用程序有大约200个UITableView行,当我在xcode上使用模拟器通过UISearchBar过滤数据时,它会立即过滤并显示结果,但是当我在我的iphone(iphone4,iOS 5.1.1)中运行我的应用程序时,它会挂起在显示任何搜索结果之前的几秒钟。我正在使用此代码来过滤数据......
- (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工作得很好,我使用其他应用程序,它们对我来说很好..
答案 0 :(得分:1)
您的设备比模拟器花费更长时间的原因是由于可用内存量。作为一般规则,请勿在模拟器中使用应用程序的性能来判断应用程序的性能。
如果您按照描述的方式过滤非常大的数据集,我建议使用调度队列来执行搜索,而不是在主队列中完成所有操作。你可以在这里阅读它们:http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
如果您不想阅读整个文档,请参阅以下代码示例。
- (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];
});
});
}
请注意,我给你的例子不是线程安全的......你需要确保在任何给定时间只执行一次搜索,否则这段代码会崩溃,因为相同的数组将被引用多个队列。如果您需要更多帮助,请发表评论,我会尽力了解。