按用户位置排序 NSFetchedResultsController 结果

Posted

技术标签:

【中文标题】按用户位置排序 NSFetchedResultsController 结果【英文标题】:Sort NSFetchedResultsController results by user location 【发布时间】:2010-04-19 16:49:53 【问题描述】:

我有一个应用程序,其中包含 Core Data 中的一些位置,我想按照与用户位置的接近顺序向用户显示它们。我正在使用 NSFetchedResultsController 将位置提供给表视图。我考虑过创建一个虚拟访问器方法,该方法返回位置与用户的距离,该方法将使用“全局”CoreLocationManager 计算,但它崩溃的原因是:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“keypath distanceFromCurrentLocation not found in entity ”

我还为用户提供了按字母顺序排序的选项,因此如果可能的话,我希望保留 NSFetchedResultsController。

我该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 的问题(或缺少的功能)是缺少将瞬态属性用于排序顺序和节键路径的能力。

我也遇到过这个问题,所以你可能对此感兴趣:

NSFetchedResultsController sections localized sorted

如果您可以保证有限的记录集,我相信您也可以使用这种方法。但我真的很想看到更复杂的解决方案。

【讨论】:

【参考方案2】:

除非您在实体中定义了瞬态属性,否则虚拟访问器将无法在 Core Data 中工作。 NSFetchedResultsController(和所有其他核心数据操作)在尝试执行任何操作之前查看实体图。如果虚拟属性没有出现在实体定义中,那么 NSFetchedResultsController 将报告不存在这样的属性。

你想在实体中定义一个名为distanceFromCurrentLocation 的瞬态属性,你应该能够编写一个虚拟访问器并让 NSFetchedResultsController 看到它。

【讨论】:

我在使用瞬态属性时遇到了同样的崩溃。只有当它成为标准属性时它才能工作,但我猜它在概念上是错误的。 不确定您到底想做什么。您是将位置存储在 Core Data 实体中,还是尝试使用 Core Data 组织位置以在表格中显示而不先将它们插入实体?如果是后者,那就不行了。【参考方案3】:

我尝试做同样的事情,按与某个位置的距离对结果进行排序。这是我的一个问题:

Core Data and Core Location

事实证明,您必须将所有位置加载到内存中才能进行比较。我最终使用了 SQLite,它更难实现,但让我对这种功能的头痛要少得多。

这可能不是你想要的答案,但如果你有一个大数据集,我会推荐 SQLite。对我来说,它最终变得更快、更容易处理。

【讨论】:

不幸的是,SQLite 不是我的选择,因为我需要使用现有的核心数据数据库...无论如何感谢您的提示 ;)

以上是关于按用户位置排序 NSFetchedResultsController 结果的主要内容,如果未能解决你的问题,请参考以下文章

按用户位置与 Firebase 附近的距离对数组进行排序

CouchDB - 按位置对文档进行排序

如何从按距离排序的 JPA 实体中获取结果?

Google place 自动完成 api 按位置对结果进行排序

Tinysort 按多个属性排序(多于1个)

Swift - 从 Firebase DB 中提取的数据中按最近位置排序