ios – 核心数据中的位置按NSFetchedResultsController的距离排序?

前端之家收集整理的这篇文章主要介绍了ios – 核心数据中的位置按NSFetchedResultsController的距离排序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的iOS Core Data数据库中有一组实体对象,用于描述某个位置的内容.我们称实体位置.我已经通过在Location上有两个属性来实现这一点,这两个属性引用了位置 – 纬度和经度,两个都是双倍的.还有其他元素,如名称.

我使用NSFetchedResultsController将实体绑定到UITableViewController.我想要做的是将结果按距离分配到给定的CLLocationCoordinate2D.在一个非常理想的场景中,我能够刷新该列表以基于新位置重新计算排序.因此,这种类型将依赖于两个键,以及第三个“静态”变量(一个在集合中的项目之间不变的变量).

如果我用NSSortDescriptors排序任意列表,我想我可以弄清楚如何做到这一点.但是,我不控制NSFetchedResultsController中如何使用排序描述符.

有没有办法可以配置我的实体,我的NSFetchedResultsController,我的NSSortDescriptors等来完成这个?我怀疑答案不在于创建一个花哨的NSSortDescriptor,而是在实体中创建一个瞬态属性来表示与我的距离,并定期重新计算该属性.但是,我对核心数据足够新,我不确定如何做到这一点(迭代所有实体并重新计算字段).我也不确定NSSortDescriptors是否可以处理Transient属性.

解决方法

(来自评论:)

对(基于sqlite的)Core Data存储的获取请求不能使用基于瞬态属性或基于Objective-C的谓词的排序描述符.

如果您不想失去获取结果控制器的优点(如动画表视图更新,自动分组到部分等),您必须预先计算到当前位置的距离并将其存储在(持久)属性中你的对象

或者,您可以获取所有对象并在内存中对它们进行排序.在这种情况下,您可以使用任意排序描述符.但是这不能与获取的结果控制器结合使用,因此您必须在托管对象上下文中注册更改并在必要时重新加载表.

猜你在找的iOS相关文章