采用核心数据,按多个标准过滤。我想要 NSPredicate 吗?

Posted

技术标签:

【中文标题】采用核心数据,按多个标准过滤。我想要 NSPredicate 吗?【英文标题】:Adopting Core Data, Filtering by Several Criteria. Do I Want NSPredicate? 【发布时间】:2016-06-30 02:50:40 【问题描述】:

我已经有一段时间没有接触 Core Data 了,现在我正在尝试将应用程序移到它上面。数据以 JSON 格式从服务器下载,并存储为几个平面文件。

当用户与应用交互时,我会一次将特定屏幕的整个数据集(数百个条目)加载到内存中。然后,用户可以按到它们的距离过滤记录(在我的情况下,它们是场所)。 (位置由 Core Data 提供。)

用户还可以通过场地管理对象的其他几个属性进行过滤,以及输入搜索词。

我希望将所有这些过滤器结合起来,以允许用户搜索、排序和浏览数据。我已经编写了代码来使用内存中的 NSArray 来完成所有这些事情,但是性能很差。

我想在这里使用 NSPredicate 吗?我知道我可以使用它来按NSManagedObjects 的属性进行过滤,但是对于更多的瞬态属性,例如场地与用户的距离,我不确定这将如何工作。

使用 Core Data 实现这一目标的一般步骤是什么?

【问题讨论】:

你能在那个json中分享一些字段返回吗?我假设数据将是具有坐标而不​​是距离的场地列表,因为我认为您将在收到 json 后执行距离计算 【参考方案1】:

就距离和核心数据而言:

独立存储纬度和经度,查询以用户为中心的“正方形”中的所有内容,以及搜索半径的内半径(也就是圆所在的正方形)

在内存中手动抛出角落中的结果

就总查询而言:谓词中的一些和规则会产生奇迹

【讨论】:

我不想只按位置过滤,距离可以用核心位置计算。此外,所有项目都需要按从最近到最远的顺序列出,所以这不能解决我的问题。 对电话的简洁表示歉意:NSSortDescriptor 将帮助订购【参考方案2】:

我使用四叉树进行地理查询。它比扫描阵列快得多。我的代码来源于Wikipedia entry on Quadtrees。在MKMapView 上有几篇关于使用四叉树的博客文章。 NSPredicate 不是 Core Data 特定的过滤器。它可以应用于任何NSArray。如果您的数据集很大,有几百个点,它可能会比您的循环运行得更快。

【讨论】:

【参考方案3】:

事实证明,我确实希望 NSPredicate 用于我的大部分过滤条件,但无论如何我对它进行切片,Core Data 都无法按位置排序。

可以使用NSFetchedResultsController 按字母顺序过滤,我也可以按“type”属性和搜索词进行过滤。

正如 Internet 上其他地方所指出的,基于块的 NSSortDescriptor 不会做我想要的,因为 Core Data 需要可以编译为 SQL 语句的排序描述符。此外,Core Data 不知道如何进行 SQL 位置计算。

【讨论】:

以上是关于采用核心数据,按多个标准过滤。我想要 NSPredicate 吗?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:从过滤元素中获取最新记录

核心数据谓词根据日期属性过滤对象

按 BETWEEN 属性过滤核心数据结果

如何按日期过滤核心数据项?

如何按不相关的实体过滤核心数据

NSPredicate 按属性过滤核心数据关系 NSSet