4

我正在为使用 coredata 作为其持久性存储的 iphone 开发企业 ios 应用程序。我们有几个核心数据实体,其中一个有 30~ 个字段。我的数据集超过了这 30 个字段实体中的 45,000 个。

我需要构建一个查询,其中我的搜索字符串可以匹配对象上的 12 个不同字段之一。我的 NSPredicate 基本上是一个大老鼠窝 (property == $A) || (otherproperty == $A) ... 等等,其中 $A 是我的搜索字符串。

我们刚刚开始调整它的性能,因为它非常糟糕。有什么明显的事情我们应该做的吗?使用复合谓词并让每个子谓词为 (property == $A) 会更好吗?

想法?提前致谢。

我的(部分)解决方案——我看了一些关于核心数据的 wwdc 视频,基本上按照苹果所说的做了。这是创建从我的真实对象到另一个对象的关系以表示搜索标记。这个新的搜索令牌实体有两个字段——令牌和权重。当我将我的主要对象插入 coredata 时,我给了他一组这些搜索标记。我要查询的每个字段一个搜索令牌,令牌属性的内容是某种标准化(全小写)数据。那么我的谓词就是“任何 searchTokens.token 以 %@ 开头”。所以现在我们只是在它的索引字段上搜索一个表,我们不必在 where 子句的右侧做任何 expersions。Coredata 的搜索速度非常快。

UISearchDisplayController - 等待 N 秒或让用户在进行搜索之前按“搜索”

4

1 回答 1

3

使用复合谓词将为您提供与带有 的长字符串相同的结果||,所以不,这无济于事。

可能有帮助的是优化谓词的顺序。它们从左到右进行评估,一旦知道结果,评估就会停止。如果您有一长串逻辑 OR,并且第一个为真,那么其余的看起来如何并不重要。这些谓词甚至不会被评估。

因此,如果您可以合理地预期某些属性比其他属性更可能匹配,请将它们移到列表的前面。如果一个几乎所有时间都是“是”,那就把它作为第一个。

此外,如果这些谓词中的任何一个是数字的,则将它们移到行的前面。数字比较比字符串比较快得多,因此任何返回 YES 的数字检查都可以让您跳过任何后续字符串比较。

于 2013-10-18T00:24:24.853 回答