2013-02-21 2 views
-1

У меня возникла проблема с реализацией класса Location. Когда я запускаю приложение, я вызываю класс Location в StartApp.m, я хочу напечатать для проверки переменной cidade, но результат для Cidade2 и Cidade3 является нулевым в NSLog, я делаю что-то слишком неправильно? Я попытался изменить код, но я не могу решить проблему. Другая вещь, которую я не понимаю, - это то, почему NSLog Cidade2 печатает нуль, переменная - это класс Location. Tks за помощью!Выполнение класса с использованием CLLocationManager

Выход:

2013-02-20 21:58:09.648 MPA[484:11603] Cidade 2: (null) 
2013-02-20 21:58:09.650 MPA[484:11603] Cidade 3 : (null) 
2013-02-20 21:58:09.661 MPA[484:11603] Resolving the Address 
2013-02-20 21:58:10.390 MPA[484:11603] Found placemarks: (
    "Apple Store, San Francisco, Apple Store, San Francisco, 1800 Ellis St, San Francisco, CA 94115-4004, United States @ <+37.78584540,-122.40651750> +/- 100.00m, region (identifier <+37.78584545,-122.40652160> radius 18.96) <+37.78584545,-122.40652160> radius 18.96m" 
), error: (null) 
2013-02-20 21:58:10.391 MPA[484:11603] Cidade : California 

Localizacao.m

#import "Localizacao.h" 

@interface Localizacao() 

@end 

@implementation Localizacao 


@synthesize cidade,estado,latSend,lonSend; 

-(void)startLocalizacao 
{ 

    lm = [[CLLocationManager alloc] init]; 
    lm.delegate = self; 
    lm.desiredAccuracy = kCLLocationAccuracyBest; 
    lm.distanceFilter = kCLDistanceFilterNone; 
    [lm startUpdatingLocation]; 
    geocoder = [[CLGeocoder alloc]init]; 

    NSLog(@"Cidade 2: %@", cidade); 


} 

//Adicionado para pegar a localizacao atual 

-(void) locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 

    //Display Latitude 
    latSend = newLocation.coordinate.latitude; 


    //Display Longitude 

    lonSend = newLocation.coordinate.longitude ; 


    //Display Accurancy 

    NSString *acc = [[ NSString alloc ] initWithFormat:@"%f", 
        newLocation.horizontalAccuracy]; 

    //Update MAP 
    MKCoordinateSpan span; 
    span.latitudeDelta = .001; 
    span.longitudeDelta= .001; 


    MKCoordinateRegion region; 
    region.center = newLocation.coordinate; 
    region.span = span; 



    [acc release]; 


    NSLog(@"Resolving the Address"); 
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { 
     NSLog(@"Found placemarks: %@, error: %@", placemarks, error); 
     if (error == nil && [placemarks count] > 0) { 
      placemark = [placemarks lastObject]; 



      /*NSString *teste = [[NSString alloc ] initWithFormat:@"%@ %@\n%@ %@\n%@\n%@", 
      placemark.subThoroughfare, 
      placemark.thoroughfare, 
      placemark.postalCode, 
      placemark.locality, 
      placemark.administrativeArea, 
      placemark.country];*/ 

      cidade = placemark.administrativeArea; 
      estado = placemark.locality; 

      [lm stopUpdatingLocation]; 

      NSLog(@"Cidade : %@", cidade); 

     } else { 
      NSLog(@"%@", error.debugDescription); 
     } 
    } ]; 


} 

@end 

StartApp.m

#import "StartApp.h" 
#import "Localizacao.h" 

@interface StartApp() 

@end 

@implementation StartApp 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    Localizacao *localizacao = [[Localizacao alloc] init]; 

    [localizacao startLocalizacao]; 

    NSLog(@"Cidade3 : %@", localizacao.cidade); 


    // Do any additional setup after loading the view from its nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

Tks помощь мне

ответ

2

Вы создаете экземпляр Localizacao, а затем вызываете startLocalizacao. Метод startLocalizacao устанавливает диспетчер местоположений и просит его начать. Затем он регистрирует Cidade 2. Этот журнал происходит до того, как менеджер местоположения завершит инициализацию и до того, как приложение получит первое место. Вся эта инициализация выполняется в фоновом режиме менеджером местоположения.

Вы ничего не делаете неправильно (кроме добавления операторов журналов для данных, которые еще не инициализированы). Вам просто нужно понять, что события местоположения асинхронны, и они приходят, когда они доступны.

+0

Tks rmaddy для обновления. У меня не так много навыков с асинхронными и потоками. Как я могу подождать окончания менеджера местоположений, чтобы дать значение в localizacao.cidade? Я искал dispatch_async, это правильно? Tks – Cauca

+0

Друзья, вы можете мне помочь по этому вопросу? Я еще не могу запустить свой код. Tks – Cauca

Смежные вопросы