带有嵌套数组的 NSPredicate

Posted

技术标签:

【中文标题】带有嵌套数组的 NSPredicate【英文标题】:NSPredicate with nested arrays 【发布时间】:2014-12-11 21:14:47 【问题描述】:

我有以下对象结构

分类:

子类别(子类别的nsarray)

子类别:

问题(问题的nsarray)

问题:

问题(nsstring)

答案(nsstring)

我需要用给定的子字符串搜索任何问题

以下谓词不起作用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.questions.question CONTAINS[cd] %@", substring];

如何正确获取它们?

【问题讨论】:

【参考方案1】:

对于更复杂的谓词字符串语法,我通常使用 predicateWithBlock 来评估它们,因为它更容易调试和理解。但是,为此,如果您只想获取包含给定子字符串的类别中的所有问题,我将使用:

NSArray *questions = [self arrayByFlattening:[categories valueForKeyPath:@"subcategories.questions"]];
questions = [questions filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"question CONTAINS[cd] %@", substring]];

其中 arrayByFlatning 是一种扁平化数组的方法。

如果您需要一次提取全部执行,则此方法效果不佳,即,如果您正在使用具有大量样本源的核心数据并且不想提取超出您需要的数据,然后过滤结果.

【讨论】:

我想获取问题但保留我的数组结构。我仍然希望它们在类别内的子类别数组中【参考方案2】:

我认为这种极端的嵌套数据是一个非常糟糕的主意。它过于复杂且容易出错。很多事情并不直观。例如,您的谓词将获取与您的查询匹配的问题的所有类别。您仍然会得到整个类别,包括与查询不匹配的所有问题。要向下钻取,您必须再次过滤。

对于这种设置,我非常推荐 Core Data。您可以只获取必要的问题,因为在 Core Data 中,关键路径在两个方向上都有效,而这正是您所需要的。

对于您的特定问题,您将获取与谓词匹配的 Question 实例

[NSPredicate predicateWithFormat:@"question CONTAINS[cd] %@", substring];

您会得到一个包含所有类别的列表,其中包含一个简洁的表达式,例如

[questions valueForKeyPath:@"subcategory.category"];

【讨论】:

以上是关于带有嵌套数组的 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

选择带有restangular或angular的嵌套数组元素

如何将带有对象的数组中的数据动态添加到嵌套数组中?

restkit 映射嵌套数组为空(带有 json 响应的嵌套 restkit 请求)

单个休息“放置”端点是不是足以更新带有嵌套数组的文档?

带有嵌套循环的多维数组Javascript

带有数组映射的restkit嵌套对象