gpt4 book ai didi

ios - 如何使用 iOS 按距离对数组进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:17:43 24 4
gpt4 key购买 nike

我仍在学习 Objective-C 和 iOS,但遇到了问题。我正在从 CoreData 创建一个包含纬度和经度的数组。我想获取这个数组并按最近的位置对其进行排序。

这是我目前所拥有的:

NSError *error = nil;
NSFetchRequest *getProjects = [[NSFetchRequest alloc] init];
NSEntityDescription *projectsEntity = [NSEntityDescription entityForName:@"TimeProjects" inManagedObjectContext:context];

[getProjects setEntity:projectsEntity];
projectArray = [[context executeFetchRequest:getProjects error:&error] mutableCopy];

for (NSObject *project in projectArray) {
// Get location of house
NSNumber *lat = [project valueForKey:@"houseLat"];
NSNumber *lng = [project valueForKey:@"HouseLng"];


CLLocationCoordinate2D coord;
coord.latitude = (CLLocationDegrees)[lat doubleValue];
coord.longitude = (CLLocationDegrees)[lng doubleValue];

houseLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
//NSLog(@"House location: %@", houseLocation);

CLLocationDistance meters = [houseLocation distanceFromLocation:currentLocation];

}

我也有这个排序代码,但我不确定如何将两者放在一起。

[projectArray sortUsingComparator:^NSComparisonResult(id o1, id o2) {
CLLocation *l1 = o1, *l2 = o2;

CLLocationDistance d1 = [l1 distanceFromLocation:currentLocation];
CLLocationDistance d2 = [l2 distanceFromLocation:currentLocation];
return d1 < d2 ? NSOrderedAscending : d1 > d2 ? NSOrderedDescending : NSOrderedSame;
}];

有人可以帮助我让这两个东西一起工作吗?

最佳答案

您的 sortUsingComparator block 需要 CLLocation 对象,而不是您的实例核心数据类。这很容易修复,但我建议的是:

  • 为您的实体添加一个transient 属性currentDistance。 ( transient 属性不存储在持久存储文件中。)类型应为“Double”。
  • 获取对象后,为 projectArray 中的所有对象计算 currentDistance
  • 最后使用 currentDistance 键上的排序描述符对 projectArray 数组进行排序。

优点是每个物体只计算一次到当前位置的距离,不会在comparator方法中重复计算。

代码看起来像这样(未经编译器检查!):

NSMutableArray *projectArray = ... // your mutable copy of the fetched objects
for (TimeProjects *project in projectArray) {
CLLocationDegrees lat = [project.houseLat doubleValue];
CLLocationDegrees lng = [project.houseLng doubleValue];
CLLocation *houseLocation = [[CLLocation alloc] initWithLatitude:lat longitude:lng];
CLLocationDistance meters = [houseLocation distanceFromLocation:currentLocation];
project.currentDistance = @(meters);
}
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"currentDistance" ascending:YES]
[projectArray sortUsingDescriptors:@[sort]];

或者,您可以使currentDistance 成为实体的持久 属性,并在创建或修改对象时计算它。优点是你可以添加基于 currentDistance 的排序描述符到获取请求而不是获取首先,然后排序。缺点当然是要重新计算当前位置更改时的所有值。

关于ios - 如何使用 iOS 按距离对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com