当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何获取按计算值排序的托管对象》经验,为你挑选了1个好方法。

我正在使用使用CoreData的应用程序.存在包含纬度和经度值的位置实体.我想获取按距离排序到用户位置的实体.我试图将排序描述符设置为距离公式sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2)但是它失败,异常"... keypath ...在实体中找不到".

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];

我想获取已经排序的对象,而不是全部获取它们然后在代码中排序.

任何提示赞赏.



1> mohsenr..:

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

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

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

还有一点.您的距离公式无法正常工作,如lat.而且很长.没有相同的比例,除非你在赤道上.用这个:

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

如果距离超过几百公里,则需要球面余弦定律:

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

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有