FS.O
FS.O

Reputation: 401

GMSGeoCoder reverseGeocodeCoordinate: completionHandler: on background thread

I need to get the city name from 2 coordinates (I'm using GMSGeoCoder -reverseGeocodeCoordinate: completionHandler: method) and then to comapre the objects.

The problem is that the method is running on a background thread (not in the main thread) and when I try to compare (using if statement) the objects (userCity and storeCity- both NSString) is still nil.

My code:

//Checking user's city
        __block NSString *userCity;
        [[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
            if (error) {
                NSLog(@"%@",[error description]);
            }
            userCity=[[[response results] firstObject] locality];
        }];
        //Checking store's city
        __block NSString *storeCity;
        [[GMSGeocoder geocoder]reverseGeocodeCoordinate:arounder.radiusCircularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
            if (error) {
                NSLog(@"%@",[error description]);
            }
            arounderCity=[[[response results] firstObject] locality];
        }];
        if ([userCity isEqualToString:arounderCity]) {
            return YES;
        }

Any idea? Thanks!

Upvotes: 0

Views: 1950

Answers (1)

Daij-Djan
Daij-Djan

Reputation: 50089

Restructure your code to proceed after the async tasks are done:

This also has the benefit that you don't actively wait for stuff and block the main thread

e.g.:

- (void)checkCitiesWithCompletionBlock:(void (^)(BOOL same))
    //Checking user's city
    [[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@",[error description]);
        }
        id userCity=[[[response results] firstObject] locality];

        //Checking store's city
        [[GMSGeocoder geocoder]reverseGeocodeCoordinate:arounder.radiusCircularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
            if (error) {
                NSLog(@"%@",[error description]);
            }
            id arounderCity=[[[response results] firstObject] locality];

            same ([userCity isEqualToString:arounderCity]);
        }];
    }];
}   

Upvotes: 1

Related Questions