我需要显示来自Recipe实体的配方列表,该配方实体在类别属性上进行过滤,该属性设置与RecipeCategory实体的关系。
下图应该为您提供结构。
我有
var recipes = [Recipe]()
var filteredRecipe = [Recipe]()
且filteredRecipe将具有按RecipeCategory实体的name
属性值过滤的配方对象。
以下是一个可用于过滤title属性的工作代码。 这种方法有效,因为title是Recipe实体的一个属性。
filteredRecipes = recipes.filter({$0.title!.rangeOfString(lowercased) != nil})
但是,如果我尝试使用valueForKey()
来过滤类别关系(NSManagedObject),那么
filteredRecipe = recipes.filter({$0.category!.valueForKey("name")!.rangeOfString(lowercased) != nil})
它不会过滤,而是会返回完整的食谱清单。
我见过人们使用Predicate,但我想避免每次都提出新的获取请求。相反,我想过滤所提取的数据。如何过滤关系属性的值并获取主对象的过滤结果(配方实体)?
答案 0 :(得分:1)
您可以在不从商店获取的情况下使用谓词。 NSPredicate
可用于集合以及NSFetchRequest
。
您也可以编写过滤器:
let filteredRecipe = recipes.filter({
if let category = $0.category {
if let name = category.valueForKey("name") {
return name.rangeOfString(lowercased) == nil
} else {
return false
}
} else {
return false
}
})
就个人而言,我会使用谓词:
let predicate = NSPredicate(format: "category.name in %@", ["Main", "Desert", "Side"])
let filtered = recipes.filter({predicate.evaluateWithObject($0)})
在测试项目中更多地使用过滤器。以下是没有NSManagedObject
子类的代码,因此valueForKey
和司法使用可选的转换:
let filteredRecipe = recipes?.filter({
if let category = $0.valueForKey("category") as? NSManagedObject {
if let name = category.valueForKey("name") as? String {
return name.rangeOfString(lowercased) == nil
} else {
return false
}
} else {
return false
}
})