Цикл выполнения CLLocationManager - PullRequest
       20

Цикл выполнения CLLocationManager

0 голосов
/ 13 сентября 2011

Я получаю бесконечный цикл с приведенным ниже кодом.Когда пользователь нажимает кнопку метода «getDirections», предупреждение срабатывает правильно.При выборе «Получить Drections» из кнопок оповещения, Google Maps работает отлично.Когда они снова открывают приложение, оно открывается обратно в это представление, и приложение немедленно возвращается к картам Google, снова перезапуская метод.Единственный способ остановить это - сделать так, чтобы «Приложение не запускалось в фоновом режиме» было обращено в ДА, чего я не хочу делать.

Может ли кто-нибудь сказать мне, почему это происходит?

-(IBAction)getDirections
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Directions" message:@"Do you want driving directions?" delegate:self cancelButtonTitle:@"No Thanks" otherButtonTitles:@"Get Directions", nil];
    [alert show];
    [alert release];
}

-(void)showDirections
{
    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
    [locationManager setDelegate:self];

    [locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    CLLocationCoordinate2D coord = [newLocation coordinate];
    NSArray *array = [dataHold objectForKey:@"Subtree"];
    NSString *latitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:4]];
    NSString *longitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:5]];
    double clubLatitude = [latitude doubleValue];
    double clubLongitude = [longitude doubleValue];
    urlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f", coord.latitude, coord.longitude, clubLatitude, clubLongitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
        buttonString = [alertView buttonTitleAtIndex:buttonIndex];
        if([buttonString isEqualToString:@"Get Directions"] )
        {
            [self showDirections];
            buttonString = nil;
        }
        else if( [buttonString isEqualToString:@"No Thanks"] )
        {
            nil;
        }
}

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Вам не хватает следующего фрагмента кода. Вы должны добавить его в (void) locationManager: (CLLocationManager *) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) метод oldLocation

[locationManager stopUpdatingLocation];
2 голосов
/ 13 сентября 2011

Метод делегата didUpdateToLocation вызывается постоянно после того, как вы ccll CLLocationManager startUpdatingLocatoin.

Таким образом, ваш код внутри этого didUpdateToLocation вызывается каждый раз, когда местоположение обновляется - даже когда вы запускаете приложение обратно из фона. И метод вызывается много раз в зависимости от свойства distanceFilter вашего LocationManager. Вы можете подтвердить это, добавив оператор NSLog в метод делегата и посмотрите, сколько раз он вызывается.

Документы по этому методу:

Обсуждение Реализация этого метода является необязательной Вам следует реализовать этот метод, однако.

К тому времени, когда это сообщение будет доставлено вашему делегату, новый данные о местоположении также доступны непосредственно из CLLocationManager объект. Параметр newLocation может содержать данные, которые были кэшированы от предыдущего использования службы определения местоположения. Вы можете использовать свойство timestamp объекта location для определения того, данные о местоположении.

Следуйте этому руководству и сохраните метку времени (или любой другой вид идентификатора) внутри метода didUpdateToLocation.

Как только вы установили метку времени, вы можете отображать карты Google, используя эти значения. Замечание: Ваш CLLocationManager имеет свойство location, которое получает обновления каждый раз, когда вызывается didUpdateToLocation - таким образом, вы можете положиться на это свойство для получения текущего местоположения в другом месте вашего кода.

HTH

...