如何有效地过滤大约200,000个NSDiction的NSArray?

时间:2014-01-09 10:21:55

标签: ios core-data nsarray

我正在开发一个示例应用,当每次用户在搜索栏中输入任何字符时,我必须根据输入的字符过滤NSArray 200,000 NSDictionary个元素。 NSDictionary仅包含两个键,即“English”& “Meaning”;

到目前为止,我在UISearchBar delegate方法

中执行此操作
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@",@"English",searchText];

    _searchResult = [_dictionaryData filteredArrayUsingPredicate:searchPredicate];
}

我觉得这不是一种正确的方法,也可以过滤时间。

P.S。 - NSArray我正在填写使用核心数据

2 个答案:

答案 0 :(得分:1)

如果您强调效率,您应该将您的给定单词音译为一些仅包含ASCII字符的“规范化”形式。将这些字词保存在专用的NSArray或其他类型的容器中(例如std::vector)。

搜索字符串必须以相同的方式音译。然后,搜索功能将是高效的,因为它只需要找到给定搜索字符串作为给定单词中的子字符串。

您可以在不使用谓词的情况下实现搜索算法。您最好不要使用NSArrayNSString,而应使用std::vector<std::string>,即使用C ++。

您可以通过在其他NSDictionary中查找来获取已找到(标准化)字词的含义。

要将字符串转换为音译形式,您可以查看以下参考资料:

答案 1 :(得分:0)

可能更好的想法是将所有这些放入SQLLite数据库并使用SQLLite机制对其进行过滤。

我不认为使用NSArray你可以比谓词更快。

此外,它还可以提高应用程序的大量内存使用量 - 将所有这些条目一次性放入内存根本没有意义。最好只保留屏幕上可见的那个 - 如果您使用CoreData,那么有一种简单的方法 - 检查NSFetchedResultsController

如果您想要一些关于Core Data的优秀教程,请访问:

http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started