用于获取对象的谓词,其参数包含在特定的 NSSet 中

Posted

技术标签:

【中文标题】用于获取对象的谓词,其参数包含在特定的 NSSet 中【英文标题】:Predicate to fetch objects which parameter is contained in an specific NSSet 【发布时间】:2015-04-07 13:30:35 【问题描述】:

我有以下实体:

PBOUserPBOBusinessPBOLocation

PBOUser可能有很多业务。 PBOBusiness 可能有很多位置。 PBOLocation 可能只属于一个企业。 PBOBusiness 可能属于多个用户。

我需要找到属于我的用户拥有的企业的这些位置。

let predicate = NSPredicate(format: "business IN %@", myUser.businesses)

let locations = PBOLocation.MR_findAllWithPredicate(predicate) as? [PBOLocation]

但它不起作用。如何快速做到这一点?

【问题讨论】:

【参考方案1】:

如果您想将其作为查询进行,则需要使用 SUBQUERY 谓词

let predicate = NSPredicate(format: "SUBQUERY(business.users, $user, $user == %@).@count > 0", myUser)
business.users 是您要测试其元素的集合的 keyPath 集合中的每个项目都根据谓词$user == %@ 进行评估 当根据谓词评估每个项目时,我们使用 $user 将其作为单个元素的变量名称以在谓词中使用

SUBQUERY 将返回一组匹配的结果,因此总结一下,我们使用@count > 0 表示是否至少有一个匹配项,那么这符合我们的标准

【讨论】:

【参考方案2】:

您可能会想出一个有效的谓词。但是由于您已经引用了PBOUser,因此您使事情变得比需要的更难。考虑一下

PBOUserPBOBusiness 有关系 PBOBusiness has a relationship toPBOLocation`

通过这些关系,用户的企业是myUser.businesses,如您的代码 sn-p 中所示。因此,更进一步,利用位置是企业的财产这一事实:

let locations = myUser.businesses.valueForKey("location") as NSSet

这利用了这样一个事实:数组或集合上的valueForKey 将在集合的每个成员上调用valueForKey,并将结果作为同一种集合返回。这就是为什么它是 NSSet 的原因——如果您想要一个排序数组,请添加对 sortedArrayUsingDescriptors: 的调用。

【讨论】:

以上是关于用于获取对象的谓词,其参数包含在特定的 NSSet 中的主要内容,如果未能解决你的问题,请参考以下文章

谓词获取所有对象

核心数据获取谓词“不包含”?

具有一对多关系的复杂核心数据谓词

比较 Fetchrequest Xcode Swift OSX 核心数据的谓词中的 NSSet

将 UITextField 中的文本用于 fetchRequest 谓词

对许多人的核心数据谓词