iOS复合谓词

前端之家收集整理的这篇文章主要介绍了iOS复合谓词前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个具有照片数据库的应用程序.每张照片都有几个与之相关联的标签,并且该应用程序具有一个搜索页面,其中包含大量切换,允许用户仅基于他们感兴趣的标签搜索照片.这些标签中的每一个都存储了整数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,3,5,6,7))
AND (ANY products.productId IN (2,6))

但我似乎无法使该语法工作.

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

还是有更好的方式来一起处理这种类型的核心数据查询

解决方法

使用收集谓词,如
[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@",pubIDs];
[NSPredicate predicateWithFormat:@"brands.brandID in %@",brandIDs];
[NSPredicate predicateWithFormat:@"product.productID in %@",productIDs];

现在,您只需要保留三个属性数组,并使用andPredicateWithSubpredicates创建一个三元复合谓词.

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

应该执行OK.

原文链接:https://www.f2er.com/iOS/328649.html

猜你在找的iOS相关文章