用于获取对象的谓词,其参数包含在特定的 NSSet 中
Posted
技术标签:
【中文标题】用于获取对象的谓词,其参数包含在特定的 NSSet 中【英文标题】:Predicate to fetch objects which parameter is contained in an specific NSSet 【发布时间】:2015-04-07 13:30:35 【问题描述】:我有以下实体:
PBOUser
、PBOBusiness
和 PBOLocation
。
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
,因此您使事情变得比需要的更难。考虑一下
PBOUser
与 PBOBusiness
有关系
PBOBusiness has a relationship to
PBOLocation`
通过这些关系,用户的企业是myUser.businesses
,如您的代码 sn-p 中所示。因此,更进一步,利用位置是企业的财产这一事实:
let locations = myUser.businesses.valueForKey("location") as NSSet
这利用了这样一个事实:数组或集合上的valueForKey
将在集合的每个成员上调用valueForKey
,并将结果作为同一种集合返回。这就是为什么它是 NSSet
的原因——如果您想要一个排序数组,请添加对 sortedArrayUsingDescriptors:
的调用。
【讨论】:
以上是关于用于获取对象的谓词,其参数包含在特定的 NSSet 中的主要内容,如果未能解决你的问题,请参考以下文章
比较 Fetchrequest Xcode Swift OSX 核心数据的谓词中的 NSSet