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

时间:2015-04-07 13:30:36

标签: ios swift core-data predicate magicalrecord

我有以下实体:

PBOUserPBOBusinessPBOLocation

  • PBOUser可能有很多业务。
  • PBOBusiness可能包含很多位置。
  • PBOLocation可能只属于一家公司。
  • PBOBusiness可能属于许多用户。

我需要找到属于我的用户所拥有的那些商家的这些位置。

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

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

但它不起作用。如何快速完成这项工作?

2 个答案:

答案 0 :(得分:1)

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

let predicate = NSPredicate(format: "SUBQUERY(business.users, $user, $user == %@).@count > 0", myUser)
  • business.users是要测试其元素的集合的keyPath
  • 系列中的每个项目都会再次使用谓词$user == %@
  • 进行评估
  • 当针对谓词评估每个项目时,我们使用$user来使谓词中使用的单个元素的变量名称

SUBQUERY将返回匹配的结果集合,以便总结我们使用@count > 0来说明是否至少有一个匹配,那么这符合我们的标准

答案 1 :(得分:0)

你可能想出一个有效的谓词。但是既然你已经引用了PBOUser,那么你就会比他们需要的更难。考虑一下

  • PBOUserPBOBusiness
  • 有关系
  • PBOBusiness has a relationship to PBOLocation`

通过这些关系,用户的商家信息为myUser.businesses,与您的代码段一样。因此,更进一步,并使用位置是企业财产的事实:

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

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