在我的核心数据模型中,我想搜索一个与其他实体具有一对一关系并且具有所有 10 个属性的实体。如果关键字出现在实体中的任何位置(甚至在子实体中),我应该能够打印相同的实体。
使用枚举块,对我来说不是一个好的选择。
我应该如何在不影响性能的情况下进行搜索?
在我的核心数据模型中,我想搜索一个与其他实体具有一对一关系并且具有所有 10 个属性的实体。如果关键字出现在实体中的任何位置(甚至在子实体中),我应该能够打印相同的实体。
使用枚举块,对我来说不是一个好的选择。
我应该如何在不影响性能的情况下进行搜索?
尝试使用NSPredicate
可以写关键字和实体名称的地方NSFetchRequest
实际上,如果您使用快速枚举返回,并像这样使用 rangeOfString :
NSString * lowerCaseTerm = [term lowercaseString];
NSString * content = [(NSString*)[theEntity valueForKey:"key"] lowercaseString];
BOOL containsWord = [content rangeOfString:lowerCaseTerm].location == NSNotFound ? false : true;
其中“内容”是您在实体中寻找的“NSString”,您将获得比 NSPredicate 更好的性能。谓词更优雅(代码少得多),但比 rangeOfString 慢得多。(需要一些设置)
如果你想查看一个实体的多个键,那么设置一个快速数组并循环它。@[@"key1",@"key2"];
我使用这种方法不仅可以查找实体是否包含单词,还可以确定相关性。使用 NSPredicate 搜索 2000 多个实体并过滤掉不需要的实体需要 7 秒,然后再求助。
使用 rangeOfString 一切都需要大约 0.25 秒。辅助线程上 0.5 秒。(针对我的具体案例的仪器报告。为了让客户满意,我需要提供加权相关性来订购。)
(提示:在内容中找到这个词就是挂断的地方)
自然地,您将希望使用辅助线程来防止您的 UI 在执行此操作时锁定。如果需要更清楚,请告诉我。