带有比较器的 NSSortDescriptor 使用实际对象而不是键值

NSSortDescriptor with Comparator using actual object not a key value

我在 CoreData MyObject 中有一个实体,它具有属性 latitudelongitude

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

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

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

我不确定如何在不重新填充记录的距离字段的情况下执行此操作。

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

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

但是由于内存压力导致应用程序崩溃(笑)。

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

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

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

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

  1. 从 CoreData 为 MyObject 实体创建 NSFetchRequest
  2. executeFetchRequest 获取数据库中的所有位置。
  3. 遍历 MyObject 数组并通过计算 currentLocation 和 MyObject 的位置 (lat,long) 之间的距离来填充距离 属性
  4. 将1中创建的fetch请求的sortDescriptor设置为distance
  5. 使用此提取请求创建 FRC 并调用 performFetch
  6. 使用FRC的fetchedObjects,会按照distance排序。

希望这对你有用。