获取数据后过滤关系

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
    }
})