获取数据后过滤关系
Filter on relationship after fetching data
我需要显示来自 Recipe 实体的食谱列表,该列表根据设置与 RecipeCategory 实体的关系的类别属性进行过滤。
下图应该给你结构。
我有
var recipes = [Recipe]()
var filteredRecipe = [Recipe]()
filteredRecipe 将具有根据 RecipeCategory 实体的 name
属性值过滤的配方对象。
下面是一个工作代码,用于过滤 title 属性。
这种方法之所以有效,是因为 title 是 Recipe 实体的一个属性。
filteredRecipes = recipes.filter({[=11=].title!.rangeOfString(lowercased) != nil})
但是如果我尝试使用 valueForKey()
过滤类别关系 (NSManagedObject),就像这样
filteredRecipe = recipes.filter({[=12=].category!.valueForKey("name")!.rangeOfString(lowercased) != nil})
它不会过滤,而是 return 完整的食谱列表。
我见过有人使用 Predicate,但我想避免每次都发出新的提取请求。相反,我想过滤获取的数据。如何过滤关系属性的值并获得主要对象(配方实体)的过滤结果?
您可以在不从商店获取的情况下使用谓词。 NSPredicate
可用于集合以及 NSFetchRequest
.
你也可以写出过滤器:
let filteredRecipe = recipes.filter({
if let category = [=10=].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([=11=])})
更新
在测试项目中进一步使用过滤器。这是没有 NSManagedObject
子类的代码,因此 valueForKey
和可选的转换被司法使用:
let filteredRecipe = recipes?.filter({
if let category = [=12=].valueForKey("category") as? NSManagedObject {
if let name = category.valueForKey("name") as? String {
return name.rangeOfString(lowercased) == nil
} else {
return false
}
} else {
return false
}
})
我需要显示来自 Recipe 实体的食谱列表,该列表根据设置与 RecipeCategory 实体的关系的类别属性进行过滤。
下图应该给你结构。
我有
var recipes = [Recipe]()
var filteredRecipe = [Recipe]()
filteredRecipe 将具有根据 RecipeCategory 实体的 name
属性值过滤的配方对象。
下面是一个工作代码,用于过滤 title 属性。 这种方法之所以有效,是因为 title 是 Recipe 实体的一个属性。
filteredRecipes = recipes.filter({[=11=].title!.rangeOfString(lowercased) != nil})
但是如果我尝试使用 valueForKey()
过滤类别关系 (NSManagedObject),就像这样
filteredRecipe = recipes.filter({[=12=].category!.valueForKey("name")!.rangeOfString(lowercased) != nil})
它不会过滤,而是 return 完整的食谱列表。
我见过有人使用 Predicate,但我想避免每次都发出新的提取请求。相反,我想过滤获取的数据。如何过滤关系属性的值并获得主要对象(配方实体)的过滤结果?
您可以在不从商店获取的情况下使用谓词。 NSPredicate
可用于集合以及 NSFetchRequest
.
你也可以写出过滤器:
let filteredRecipe = recipes.filter({
if let category = [=10=].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([=11=])})
更新
在测试项目中进一步使用过滤器。这是没有 NSManagedObject
子类的代码,因此 valueForKey
和可选的转换被司法使用:
let filteredRecipe = recipes?.filter({
if let category = [=12=].valueForKey("category") as? NSManagedObject {
if let name = category.valueForKey("name") as? String {
return name.rangeOfString(lowercased) == nil
} else {
return false
}
} else {
return false
}
})