我正在开发一个示例应用,当每次用户在搜索栏中输入任何字符时,我必须根据输入的字符过滤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我正在填写使用核心数据
答案 0 :(得分:1)
如果您强调效率,您应该将您的给定单词音译为一些仅包含ASCII字符的“规范化”形式。将这些字词保存在专用的NSArray
或其他类型的容器中(例如std::vector
)。
搜索字符串必须以相同的方式音译。然后,搜索功能将是高效的,因为它只需要找到给定搜索字符串作为给定单词中的子字符串。
您可以在不使用谓词的情况下实现搜索算法。您最好不要使用NSArray
和NSString
,而应使用std::vector<std::string>
,即使用C ++。
您可以通过在其他NSDictionary
中查找来获取已找到(标准化)字词的含义。
要将字符串转换为音译形式,您可以查看以下参考资料:
[NSString] dataUsingEncoding:allowLossyConversion:
编码等于NSASCIIStingEncoding
且allowLossyConversion设置为YES
。
[NSString] stringByFoldingWithOptions:locale:使用选项NSDiacriticInsensitiveSearch和(可能)当前区域设置。
答案 1 :(得分:0)
可能更好的想法是将所有这些放入SQLLite数据库并使用SQLLite机制对其进行过滤。
我不认为使用NSArray你可以比谓词更快。
此外,它还可以提高应用程序的大量内存使用量 - 将所有这些条目一次性放入内存根本没有意义。最好只保留屏幕上可见的那个 - 如果您使用CoreData,那么有一种简单的方法 - 检查NSFetchedResultsController
如果您想要一些关于Core Data的优秀教程,请访问:
http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started