SearchBar挂在iPhone上,但在模拟器上工作正常

时间:2013-04-30 21:14:00

标签: iphone ios uisearchbar

我的应用程序有大约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工作得很好,我使用其他应用程序,它们对我来说很好..

1 个答案:

答案 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];
        });
    });
}

请注意,我给你的例子不是线程安全的......你需要确保在任何给定时间只执行一次搜索,否则这段代码会崩溃,因为相同的数组将被引用多个队列。如果您需要更多帮助,请发表评论,我会尽力了解。