采用核心数据,按多个标准过滤。我想要 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 吗?我知道我可以使用它来按NSManagedObject
s 的属性进行过滤,但是对于更多的瞬态属性,例如场地与用户的距离,我不确定这将如何工作。
使用 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章