Alex
Alex

Reputation: 511

locationManager is not updating the Location

i am using this code to get the Location ,using simulator , but its not giving me any output . also if someone suggest me a solution of this or a better alternative solution.\

 -(void)viewDidAppear:(BOOL)animated
 {
_locationManager.delegate=self;
 [_locationManager startUpdatingLocation];
[self.geoCoder reverseGeocodeLocation: _locationManager.location completionHandler:
 ^(NSArray *placemarks, NSError *error) {
      if (error) {
         return;
     }

     if (placemarks && placemarks.count > 0)
     {
         CLPlacemark *placemark = placemarks[0];

         NSDictionary *addressDictionary =
         placemark.addressDictionary;

         NSString *address = [addressDictionary
         objectForKey:(NSString *)kABPersonAddressStreetKey];
         NSString *city = [addressDictionary
                           objectForKey:(NSString *)kABPersonAddressCityKey];
         NSString *state = [addressDictionary
                            objectForKey:(NSString *)kABPersonAddressStateKey];
         NSString *zip = [addressDictionary
                          objectForKey:(NSString *)kABPersonAddressZIPKey];

         NSString *Countrynsme = [addressDictionary
                                  objectForKey:(NSString *)kABPersonAddressCountryKey];

         _requestorAddressText.Text = address;
         _requestorCityText.text = city;
         _requestorPostalText.text = zip;
         _CountryrequestorText.text = Countrynsme;
         _requestorStateText.text = state;
         }

  }];

 [_locationManager stopUpdatingLocation];
}

Upvotes: 0

Views: 277

Answers (1)

Sonny Saluja
Sonny Saluja

Reputation: 7287

CLLocationManager is an asynchronous API. You need to wait for the result of CLLocationManager before you geocode the location.

Start listening for location manager updates using the CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSTimeInterval interval = [newLocation.timestamp timeIntervalSinceNow];
    if (interval < 0) {
        interval = -interval;
    }        
    // Reject stale location updates.
    if (interval < 30.0) {
        // Start geocoding
        [geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
             // Use geocoded results
             ...
        }];
    }
    // If you're done with getting updates then do [manager stopUpdatingLocation]
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    // Handle error. Perhaps [manager stopUpdatingLocation]
}

Then viewDidAppear just bootstrap's the location lookup:

- (void)viewDidAppear {
    // PS: You're missing a call to [super viewDidAppear]
    [super viewDidAppear];
    // Start lookup for location
    _locationManager.delegate=self;
    [_locationManager startUpdatingLocation];
}

PS: In dealloc don't forget to stop updating location, cancel geocode and nil the delegates for locationManager.

Upvotes: 3

Related Questions