iphone - 如何获取按计算值排序的托管对象

标签 iphone objective-c core-data nsfetchrequest

我正在开发使用 CoreData 的应用程序。有保存纬度和经度值的位置实体。我想获取那些按到用户位置的距离排序的实体。 我试图将排序描述符设置为距离公式 sqrt ((x1 - x2)^2 + (y1 - y2)^2) 但它失败并出现异常“...键路径...未在实体中找到”。

NSString *distanceFormula = [NSString stringWithFormat:@"sqrt(((latitude - %f) * (latitude - %f)) + ((longitude - %f) * (longitude - %f)))", 
                            location.coordinate.latitude, 
                            location.coordinate.latitude, 
                            location.coordinate.longitude, 
                            location.coordinate.longitude];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:distanceFormula ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSError *error;
NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];

我想获取已排序的对象,而不是获取所有对象然后在代码中排序。

感谢任何提示。

最佳答案

NSSortDescriptor 应该使用对象属性的键字符串初始化,而不是查询字符串。这意味着您应该将距离公式作为对象的方法来实现。

这样做之后,在获取之前或之后进行排序并不重要:

NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
result = [result sortedArrayUsingSelector:@"compareDistance"];

还有一点。您的距离公式无法正常工作,如纬度。和长。没有相同的规模,除非你在赤道上。使用这个:

double latDiff = lat1-lat2;
double longDiff = (long1-long2)*cos(lat1); //cos() assumes lat1 is in radians
double distance = sqrt(latDiff*latDiff+longDiff*longDiff);

如果距离超过几百公里,需要Spherical cosines law :

// assuming angles in radian,
double separation = acos( sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(long1-long2) );
double distance = separation*earthRadius;

关于iphone - 如何获取按计算值排序的托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2788293/

相关文章:

ios - 重用单元格后 UISwitch 更改状态

ios - RFQuiltLayout 和 UICollectionView

ios - 具有多个并行DB访问的iOS-App设计

ios - UITableViewCell 在关闭模态呈现的 ViewController 后不反射(reflect)更改

带有游戏中心的 iPhone 应用程序

php - 在 iOS 上通过 PHP 在推送通知中发送表情符号

ios - 向方法添加附加行为而无需子类化

swift - NSPredicate - 使用日期属性搜索

iphone - 按日期从 iPhone 中删除本地通知

iphone - 如何在phoneGap (iphone) 中停止窗口滚动?