带有比较器的 NSSortDescriptor 使用实际对象而不是键值
NSSortDescriptor with Comparator using actual object not a key value
我在 CoreData MyObject
中有一个实体,它具有属性 latitude
和 longitude
。
我想使用 NSFetchedResultsController
执行抓取,按 MyObject
与用户当前位置的距离对抓取进行排序。
但是,我不知道在排序描述符的 Key
部分放什么。
我不想比较对象的特定键。我想比较对象本身。
我不确定如何在不重新填充记录的距离字段的情况下执行此操作。
我正在尝试使用此代码...
[[NSSortDescriptor alloc] initWithKey:@"." ascending:YES comparator:^NSComparisonResult(MyObject *object1, MyObject *opject2) {
// stuff here
}];
但是由于内存压力导致应用程序崩溃(笑)。
显然使用 @"."
是不正确的,但有没有办法做到这一点?
或者是否有使用不同方法的更好方法?
如果您不想按对象的键对对象进行排序,而是对对象本身进行排序,则不应使用排序描述符。只需获取结果数组,然后对该数组进行排序。当然,您的自定义对象 MyObject 应该实现 isEqual 才能执行此操作。
另一种方法是向 MyObject 添加一个名为 distance
的新键,然后将其用作排序描述符的键。
- 从 CoreData 为 MyObject 实体创建 NSFetchRequest
executeFetchRequest
获取数据库中的所有位置。
- 遍历 MyObject 数组并通过计算 currentLocation 和 MyObject 的位置 (lat,long) 之间的距离来填充距离 属性
- 将1中创建的fetch请求的sortDescriptor设置为
distance
- 使用此提取请求创建 FRC 并调用
performFetch
- 使用FRC的
fetchedObjects
,会按照distance
排序。
希望这对你有用。
我在 CoreData MyObject
中有一个实体,它具有属性 latitude
和 longitude
。
我想使用 NSFetchedResultsController
执行抓取,按 MyObject
与用户当前位置的距离对抓取进行排序。
但是,我不知道在排序描述符的 Key
部分放什么。
我不想比较对象的特定键。我想比较对象本身。
我不确定如何在不重新填充记录的距离字段的情况下执行此操作。
我正在尝试使用此代码...
[[NSSortDescriptor alloc] initWithKey:@"." ascending:YES comparator:^NSComparisonResult(MyObject *object1, MyObject *opject2) {
// stuff here
}];
但是由于内存压力导致应用程序崩溃(笑)。
显然使用 @"."
是不正确的,但有没有办法做到这一点?
或者是否有使用不同方法的更好方法?
如果您不想按对象的键对对象进行排序,而是对对象本身进行排序,则不应使用排序描述符。只需获取结果数组,然后对该数组进行排序。当然,您的自定义对象 MyObject 应该实现 isEqual 才能执行此操作。
另一种方法是向 MyObject 添加一个名为 distance
的新键,然后将其用作排序描述符的键。
- 从 CoreData 为 MyObject 实体创建 NSFetchRequest
executeFetchRequest
获取数据库中的所有位置。- 遍历 MyObject 数组并通过计算 currentLocation 和 MyObject 的位置 (lat,long) 之间的距离来填充距离 属性
- 将1中创建的fetch请求的sortDescriptor设置为
distance
- 使用此提取请求创建 FRC 并调用
performFetch
- 使用FRC的
fetchedObjects
,会按照distance
排序。
希望这对你有用。