根据当前位置对UITableview中的距离进行排序

时间:2014-08-21 05:39:10

标签: ios objective-c ios7.1

我如何根据与当前位置的距离对数组进行排序并在tableview中显示。当我使用下面的代码进行排序时没有得到任何正确的结果,我得到的数组随机distance.can任何人指导我解决这个问题问题

-(void)sort_distance{
// Determine distance between current location and geofence location

[distance_array removeAllObjects];

NSMutableDictionary *dict=[[NSMutableDictionary alloc] init];
CLLocation *pinLocation;
CLLocation *userLocation;

for (int i=0; i<[self.geofences count]; i++) {

    //dict =[self.geofences objectAtIndex:i];

    CLLocationDegrees firstLat = [self.currentLatitude doubleValue];
    CLLocationDegrees firstLong = [self.currentLongitude doubleValue];

    CLLocationDegrees secondLat = [[[self.geofences objectAtIndex:i] objectForKey:@"lat"] doubleValue];
    CLLocationDegrees secondLong = [[[self.geofences objectAtIndex:i] objectForKey:@"lon"] doubleValue];


    pinLocation = [[CLLocation alloc]
                               initWithLatitude:secondLat
                               longitude:secondLong];

    userLocation = [[CLLocation alloc]
                                initWithLatitude:firstLat
                                longitude:firstLong];
    CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]/1000;

    //current distance is NSNumber


    CLLocationDistance kilometers = distance /1000;
    // or you can also use this..

    distanceString = [[NSString alloc] initWithFormat: @"%.1f Km", kilometers];

    NSLog(@"sa: %@", distanceString);


    [distance_array addObject:distanceString];

    [dict setObject:[NSNumber numberWithDouble:distance] forKey:@"newdistance"];


}
NSLog(@"distance array: %@", distance_array);







// Sorting the Geofence-Location depends on distance from current location


NSSortDescriptor * sort = [[NSSortDescriptor alloc] initWithKey:@"newdistance" ascending:YES];

NSArray *sortDescriptors = [NSArray arrayWithObject:sort];

sortedArray = [self.geofences sortedArrayUsingDescriptors:sortDescriptors];


}

我的出局是

距离阵列:(     &#34; 0.2公里&#34;,     &#34; 0.4公里&#34;,     &#34; 0.2公里&#34;,     &#34; 0.6公里&#34;,     &#34; 0.7公里&#34;,     &#34; 1.0公里&#34;,     &#34; 0.3公里&#34; )

先谢谢,   Chandu。

3 个答案:

答案 0 :(得分:1)

-(void)sort_distance{
    // Determine distance between current location and geofence location

    [distance_array removeAllObjects];

    NSMutableDictionary *dict=[[NSMutableDictionary alloc] init];
    CLLocation *pinLocation;
    CLLocation *userLocation;

    for (int i=0; i<[self.geofences count]; i++) {

        //dict =[self.geofences objectAtIndex:i];

        CLLocationDegrees firstLat = [self.currentLatitude doubleValue];
        CLLocationDegrees firstLong = [self.currentLongitude doubleValue];

        CLLocationDegrees secondLat = [[[self.geofences objectAtIndex:i] objectForKey:@"lat"] doubleValue];
        CLLocationDegrees secondLong = [[[self.geofences objectAtIndex:i] objectForKey:@"lon"] doubleValue];


        pinLocation = [[CLLocation alloc]
                       initWithLatitude:secondLat
                       longitude:secondLong];

        userLocation = [[CLLocation alloc]
                        initWithLatitude:firstLat
                        longitude:firstLong];
        CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]/1000;

        //current distance is NSNumber


        CLLocationDistance kilometers = distance /1000;
        // or you can also use this..

        distanceString = [[NSString alloc] initWithFormat: @"%.1f km", kilometers];

        NSLog(@"sa: %@", distanceString);


        [distance_array addObject:distanceString];

        [dict setObject:[NSNumber numberWithDouble:distance] forKey:@"newdistance"];


    }
    NSLog(@"distance array: %@", distance_array);







    // Sorting the Geofence-Location depends on distance from current location


    sortedArray = [distance_array sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@",sortedArray);

}

答案 1 :(得分:0)

CLLocationDistance是double类型,而您将其保存为整数类型。所以你会失去一些精确度。而是使用`[NSNumber numberWithDouble:]。

这将按升序排序,降序返回NSOrderedAscending代替NSOrderedDescending,反之亦然。

-(CLLocationDistance )distanceOfCurrentPosition:(CLLocation *)userLocation WithPosition:(NSDictionary *)postition{

CLLocationDegrees secondLat = [postition[@"lat"] doubleValue];
CLLocationDegrees secondLong = [postition[@"lon"] doubleValue];

CLLocation *pinLocation = [[CLLocation alloc]
                           initWithLatitude:secondLat
                           longitude:secondLong];

CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation]/1000;
CLLocationDistance kilometers = distance /1000;
return kilometers;
}

-(void)sort_distance{
CLLocationDegrees firstLat = [self.currentLatitude doubleValue];
CLLocationDegrees firstLong = [self.currentLongitude doubleValue];

CLLocation *userLocation = [[CLLocation alloc]
                            initWithLatitude:firstLat
                            longitude:firstLong];

[_geofences sortUsingComparator:^NSComparisonResult(NSDictionary *position1, NSDictionary *position2) {

    CLLocationDistance distanceWithPosition1 = [self distanceOfCurrentPosition:userLocation WithPosition:position1];
    CLLocationDistance distanceWithPosition2 = [self distanceOfCurrentPosition:userLocation WithPosition:position2];

    if (distanceWithPosition1> distanceWithPosition2) {
        return NSOrderedDescending;
    }else if(distanceWithPosition2 > distanceWithPosition1){
        return NSOrderedAscending;
    }else{
        return NSOrderedSame;
    }

}];

NSLog(@"Order :%@",_geofences);
}

答案 2 :(得分:0)

尝试使用这些来排序数组

-(NSArray *)sortArray:(NSArray *)arrayForSort forKey:(NSString *)key
{
    return [arrayForSort sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        if([obj1 isKindOfClass:[NSDictionary class]] && [obj2 isKindOfClass:[NSDictionary class]])
            return [[obj1 objectForKey:key] compare:[obj2 objectForKey:key]];
        return NSOrderedSame;
    }];
}

请将其称为您的案例

self.geofences = [self sortArray:self.geofences forKey:@&#34; newdistance&#34;];

度过愉快的一天:)