Ios NSSortDescriptor,带有使用实际对象而非键值的比较器

Ios NSSortDescriptor,带有使用实际对象而非键值的比较器,ios,objective-c,core-data,nssortdescriptor,Ios,Objective C,Core Data,Nssortdescriptor,我在CoreDataMyObject中有一个实体,它具有属性纬度和经度 我想使用NSFetchedResultsController执行一次提取,该控制器根据MyObject距离用户当前位置的距离对提取进行排序 但是,我不知道在排序描述符的键中放入什么 我不想比较对象的特定键。我想比较对象本身 我不确定在不重新填充记录的“距离”字段的情况下,我怎么可能做到这一点 我正在尝试使用这个代码 [[NSSortDescriptor alloc] initWithKey:@"." ascending:YE

我在CoreData
MyObject
中有一个实体,它具有属性
纬度
经度

我想使用
NSFetchedResultsController
执行一次提取,该控制器根据
MyObject
距离用户当前位置的距离对提取进行排序

但是,我不知道在排序描述符的
键中放入什么

我不想比较对象的特定键。我想比较对象本身

我不确定在不重新填充记录的“距离”字段的情况下,我怎么可能做到这一点

我正在尝试使用这个代码

[[NSSortDescriptor alloc] initWithKey:@"." ascending:YES comparator:^NSComparisonResult(MyObject *object1, MyObject *opject2) {
    // stuff here
}];
但由于内存压力(lol),应用程序崩溃

显然,使用
@“
是不正确的,但有没有办法做到这一点


或者有没有更好的方法使用不同的方法来实现这一点?

如果您不想按对象的键对对象进行排序,而是要对对象本身进行排序,那么您不应该使用排序描述符。只需获取结果的数组,然后对该数组进行排序。当然,为了做到这一点,您的自定义对象MyObject应该实现isEqual

另一种选择是向MyObject添加一个名为
distance
的新键,然后将其用作排序描述符的键

  • 从CoreData为MyObject实体创建NSFetchRequest
  • executeFetchRequest
    获取数据库中的所有位置
  • 迭代MyObject数组,并通过计算currentLocation和MyObject位置(lat,long)之间的距离来填充distance属性
  • 将在1中创建的提取请求的sortDescriptor设置为
    distance
  • 使用此提取请求创建FRC并调用
    performFetch
  • 使用FRC的
    获取对象
    ,该对象将根据
    距离
    按顺序排序

  • 希望这对你有用。

    是的,你的第二个解决方案可能就是我要做的。把它们全部取出来然后分类的问题是,它打破了使用fetchedresultscontroller的整个概念。实际上不是。原因是,由于当前位置可能会发生变化,您可能每次都必须计算距离。因此,您必须使用
    executeFetchRequest
    获取所有现有(lat,long)对象。然后遍历这些对象并填充“距离”属性。然后创建一个获取结果控制器,使用距离作为排序描述符,并在FRC上调用
    performFetch
    ,以按距离获取排序结果,我想是这样的。我要么更新到核心数据中,在那里我必须获取它们全部,要么获取它们全部,然后对它们进行排序。好的,很酷,谢谢