无论您想这样做,为了避免阻塞 UI,您必须在另一个线程中执行此操作。您可以通过多种方式实现这一目标。以下是 GCD 的示例:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray *closestFive = [self closestFive];
dispatch_async(dispatch_get_main_queue(), ^{
//Tell yourself something when the process finished
[self closestAre:closestFive];
}
});
[self nearestFive] 可以通过遍历位置、计算距离、使用包裹在 NSValue 中的 CLLocation 作为键将它们存储在字典中来天真地实现。对其进行排序,并返回该数组的 subarrayWithRange:。可能有更好的实现,但是对于 2500 个元素,这不是很多,只要你在后台线程中这样做就足够了
这可能是它的一个实现:
- (NSArray *)closestFive:(CLLocation *)location from:(NSArray *)locations
{
NSMutableArray *distances = [NSMutableArray arrayWithCapacity:locations.count];
for (CLLocation *l in locations) {
NSDictionary *d = @{
@"location" : l,
@"distance" : @([location distanceFromLocation:l])
};
[distances addObject:d];
}
[distances sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
double d1 = [obj1[@"distance"] doubleValue];
double d2 = [obj1[@"distance"] doubleValue];
if (d1 > d2) {
return NSOrderedDescending;
}
else if (d1 < d2) {
return NSOrderedAscending;
}
return NSOrderedSame;
}];
return [[distances subarrayWithRange:NSMakeRange(0, 5)] valueForKey:@"location"];
}