获取数据后过滤关系

时间:2016-04-25 21:58:04

标签: ios swift core-data xcode7

我需要显示来自Recipe实体的配方列表,该配方实体在类别属性上进行过滤,该属性设置与RecipeCategory实体的关系。

下图应该为您提供结构。

enter image description here

我有

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,但我想避免每次都提出新的获取请求。相反,我想过滤所提取的数据。如何过滤关系属性的值并获取主对象的过滤结果(配方实体)?

1 个答案:

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