gpt4 book ai didi

iOS 复合谓词

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:39 27 4
gpt4 key购买 nike

我正在编写一个包含照片数据库的应用程序。每张照片都有几个与之关联的标签,该应用程序有一个搜索页面,其中包含许多切换按钮,允许用户仅根据他们感兴趣的标签搜索照片。这些标签中的每一个都存储了 integer ID,因为它们对应于外部数据库的 ID,所以我试图通过 ID 简单地查找它们。 所有 ID 字段都已编入索引。

当我编写的谓词变得非常大时,问题就出现了,因为用户可以从许多不同的标签中进行选择以进行过滤。这些标签分为 3 个类别 [出版物、品牌和产品],因此我的查询设置为在一个类别内进行“或”运算,并在这些类别之间进行“与”运算。

示例查询谓词最终看起来像这样:

(parentPublication.publicationId==1 OR parentPublication.publicationId==2 OR parentPublication.publicationId==5) 
AND (ANY brands.brandId==12 OR ANY brands.brandId==2 OR ANY brands.brandId==0 OR ANY brands.brandId==3 OR ANY brands.brandId==5 OR ANY brands.brandId==6 OR ANY brands.brandId==7)
AND (ANY products.productId==2 OR ANY products.productId==3 OR ANY products.productId==6)

它们可以变得更大,但您明白了。我的问题是,由于所有这些都执行昂贵的联接,一旦用户选择超过 10 或 15 个,查询就会运行很长时间,甚至可能导致应用程序崩溃。

似乎这样写会更有效率:

parentPublication.publicationId IN (1,2,5) 
AND (ANY brands.brandId IN (12,2,0,3,5,6,7))
AND (ANY products.productId IN (2,3,6))

但我似乎无法使用该语法。

所以我的问题是:是否支持这种类型的语法,如果支持,有人可以告诉我如何正确编写它吗?

或者是否有更好的方法来一起处理针对 Core Data 的此类查询?

最佳答案

使用集合谓词,比如

[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@", pubIDs];
[NSPredicate predicateWithFormat:@"brands.brandID in %@", brandIDs];
[NSPredicate predicateWithFormat:@"product.productID in %@", productIDs];

现在您只需保留三个属性数组并使用 andPredicateWithSubpredicates 制作一个三路复合谓词。

[NSCompoundPredicate andPredicateWithSubPredicates:@[
pubPredicate, brandPredicate, productPredicate]];

应该执行正常。

关于iOS 复合谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com