Search code examples
objective-ciosxcodegeocodingblock

CLGeocoder Multiple Addresses?


I need to geocode two different addresses but I need to have the results inside the same scope/method. How can I direct the same variables location1 and location2 inside the same block. Here is my current code...

 - (IBAction)calculateDistance {
    [textFieldDestination resignFirstResponder];
    NSString *origin = [textFieldOrigin text];
    if (origin) {
        CLGeocoder *geoCode = [[CLGeocoder alloc] init];

        [geoCode geocodeAddressString:origin completionHandler: ^(NSArray *placemarks, NSError *error) {
            if (!error) {
                CLPlacemark *place = [placemarks objectAtIndex:0];
                CLLocation *location = place.location;
                CLLocation *location1 = [[CLLocation alloc] initWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];
            } else {
                NSString *string = [NSString stringWithFormat:@"%@ - also make sure you have inputted a valid city", [error localizedDescription]];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:string delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                [alert show];
            }
        }]; 
    }

    NSString *destination = [textFieldDestination text];
    if (destination) {
        CLGeocoder *geoCode2 = [[CLGeocoder alloc] init];

        [geoCode2 geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {
            if (!error) {
                CLPlacemark *place = [placemarks objectAtIndex:0];
                CLLocation *location = place.location;
                CLLocation *location2 = [[CLLocation alloc] initWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];
            } else {
                NSString *string = [NSString stringWithFormat:@"%@ - also make sure you have inputted a valid city", [error localizedDescription]];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:string delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                [alert show];
            }
        }]; 
    }

    CLLocationDistance distanceM = [location1 distanceFromLocation:location2];  // obviously error so you can see that I need location1 and location2 in the same block.... but how!?  
    [metreDistance setText:[NSString stringWithFormat:@"%f", distanceM]];
}

Solution

  • I found out how to accomplish this. For each geocoding block, I directed to a method that had specific parameters. Pretty simple, just needed to use logic!