NSSortDescriptor与Comparator使用实际对象而不是键值

时间:2016-02-26 12:05:09

标签: ios objective-c core-data nssortdescriptor

我在CoreData MyObject中有一个实体,其中包含属性latitudelongitude

我想使用NSFetchedResultsController进行抓取,按照MyObject距离用户当前位置的距离对抓取进行排序。

但是,我不知道在排序描述符的Key部分放什么。

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

我不确定如何在不重新填充记录的距离字段的情况下这样做。

我正在尝试使用此代码...

[[NSSortDescriptor alloc] initWithKey:@"." ascending:YES comparator:^NSComparisonResult(MyObject *object1, MyObject *opject2) {
    // stuff here
}];

但由于内存压力(lol),它崩溃了应用程序。

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

或者使用不同的方法有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果您不想按键对对象进行排序,而是对对象进行排序,则不应使用排序描述符。只需获取结果数组,然后对该数组进行排序。当然,您的自定义对象MyObject应该实现isEqual才能执行此操作。

另一种方法是向MyObject添加一个名为distance的新密钥,然后将其用作排序描述符的密钥。

  1. 从CoreData
  2. 为MyObject实体创建NSFetchRequest
  3. executeFetchRequest获取数据库中的所有位置。
  4. 通过MyObject数组迭代并通过计算currentLocation和MyObject的位置(lat,long)之间的距离来填充距离属性
  5. 将1中创建的获取请求的sortDescriptor设置为distance
  6. 使用此获取请求创建FRC并调用performFetch
  7. 根据fetchedObjects使用FRC的distance排序。
  8. 希望这适合你。