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

Predicate to fetch objects which parameter is contained in an specific NSSet

我有以下实体:

PBOUserPBOBusinessPBOLocation

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

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

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

但是没用。如何快速做到这一点?

您可能想出一个有效的谓词。但是由于您已经有对 PBOUser 的引用,所以您正在使事情变得比他们需要的更难。考虑

  • PBOUserPBOBusiness
  • 有关系
  • PBOBusiness has a relationship toPBOLocation`

有了这些关系,用户的业务就是 myUser.businesses,如您的代码段所示。因此,更进一步,利用地点是 属性 企业这一事实:

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

这利用了这样一个事实,即数组或集合上的 valueForKey 将对集合的每个成员调用 valueForKey,并且 return 结果与同类集合相同.这就是为什么它是 NSSet-- 如果你想要一个排序数组,添加对 sortedArrayUsingDescriptors:.

的调用

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

let predicate = NSPredicate(format: "SUBQUERY(business.users, $user, $user == %@).@count > 0", myUser)
  • business.users 是要测试其元素的集合的键路径
  • 集合中的每一项都根据谓词$user == %@
  • 再次求值
  • 当根据谓词评估每个项目时,我们使用 $user 使其成为要在谓词中使用的单个元素的变量名称

SUBQUERY 将 return 一组匹配的结果,因此总结一下,我们使用 @count > 0 来说明是否至少有一个匹配,那么这符合我们的标准